zoukankan      html  css  js  c++  java
  • Qt之程序最小化托盘显示及操作


    展开
    1.功能说明
    对于GUI程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
    2.使用的类
    主要使用的此类:QSystemTrayIcon。
    其中QSystemTrayIcon是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击,双击,或wheel操作(好像只对X11系统有用),显示指定消息,显示菜单等。
    此类中有两个枚举类型,分别如下:
    enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由
    常量 值 描述
    QSystemTrayIcon::Unknown 0 未知原因
    QSystemTrayIcon::Context 1 请求系统托盘的上下文菜单
    QSystemTrayIcon::DoubleClick 2 鼠标双击
    QSystemTrayIcon::Trigger 3 鼠标单击
    QSystemTrayIcon::MiddleClick 4 鼠标中间按键
    enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片
    常量 值 描述
    QSystemTrayIcon::NoIcon 0 不显示图标
    QSystemTrayIcon::Information 1 显示信息图标
    QSystemTrayIcon::Warning 2 显示告警图标
    QSystemTrayIcon::Critical 3 显示致命图标
    3.QSystemTrayIcon常用函数
    void setIcon(const QIcon& icon)
    设置系统托盘的图标
    void setToolTip(const QString &tip)
    设置鼠标放到图标上的提示文字
    void setContextMenu(QMenu* menu);
    设置当点击图标弹出的菜单
    void show()
    显示系统托盘图标
    4.代码
    1.实现程序托盘显示
    a)新建一个QWidget程序,在界面上放入一个QPushButton,text改为“最小化”,如下图:

    b)给工程加入Qt Resource资源文件,添加一个在托盘显示的icon图片,如图:
     
    c)给a中的QPushButton,建立槽函数,在槽函数内实现程序最小化托盘显示
    void MainWindow::on_pushButton_clicked()
    {
        //隐藏程序主窗口
        this->hide();
        //新建QSystemTrayIcon对象
        mSysTrayIcon = new QSystemTrayIcon(this);
        //新建托盘要显示的icon
        QIcon icon = QIcon("../IMClient/Resources/GG64.png");
        //将icon设到QSystemTrayIcon对象中
        mSysTrayIcon->setIcon(icon);
        //当鼠标移动到托盘上的图标时,会显示此处设置的内容
        mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
        //在系统托盘显示此对象
        mSysTrayIcon->show();
    }

    运行程序,点击按钮最小化,可以在系统托盘看到此图标,鼠标移到上面,可以见看见代码中所设的”测试系统托盘图标”文本,如图:

    2.实现托盘图标操作
    最小化后显示在系统托盘内,此时除了在任务管理器中结束此程序,无法再做其他操作,而我们还想实现双击图标显示主界面,单击图标弹出菜单等实现其他操作,此时,就需要使用QSystemTrayIcon::ActivationReason属性了。
    a)给QSystemTrayIcon对象添加信号为activated(QSystemTrayIcon::ActivationReason)的槽函数
    b)在槽函数内,对双击事件,显示主窗口界面
    代码如下:
    void MainWindow::on_pushButton_clicked()
    {
        //隐藏主窗口
        this->hide();
        ......
        //当鼠标移动到托盘上的图标时,会显示此处设置的内容
        mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
        //给QSystemTrayIcon添加槽函数
        connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
        //在系统托盘显示此对象
        mSysTrayIcon->show();
    }
    void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
    {
        switch(reason){
        case QSystemTrayIcon::Trigger:
            //单击托盘图标
            break;
        case QSystemTrayIcon::DoubleClick:
            //双击托盘图标
            //双击后显示主程序窗口
            this->show();
            break;
        default:
            break;
        }
    }

    程序最小化后,双击托盘图标,程序的主界面可以显示了。
    最后再来考虑在单击系统托盘图标时,显示菜单功能。根据上面描述,思路很明确了,如下:
    a)新建一个QMenu menu
    b)将menu通过QSystemTrayIcon的setContextMenu函数设置到QSystemTrayIcon对象中
    再来看代码实现:
    在头文件中新增:
        QMenu *mMenu;
        QAction *mShowMainAction;
        QAction *mExitAppAction;
        ...
        public:
        void createActions();
        void createMenu();
        ...
        private slots:
        ...
        void on_showMainAction();
        void on_exitAppAction();

    在cpp中实现:
    void MainWindow::createActions()
    {
        mShowMainAction = new QAction(QObject::trUtf8("显示主界面"),this);
        connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
        mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
        connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
    }
    void MainWindow::createMenu()
    {
        mMenu = new QMenu(this);
        //新增菜单项---显示主界面
        mMenu->addAction(mShowMainAction);
        //增加分隔符
        mMenu->addSeparator();
        //新增菜单项---退出程序
        mMenu->addAction(mExitAppAction);
        //把QMenu赋给QSystemTrayIcon对象
        mSysTrayIcon->setContextMenu(mMenu);
    }
    /*
    * 当在系统托盘点击菜单内的显示主界面操作
    */
    void MainWindow::on_showMainAction()
    {
        this->show();
    }
    /*
    * 当在系统托盘点击菜单内的退出程序操作
    */
    void MainWindow::on_exitAppAction()
    {
        exit(0);
    }


    然后
    void MainWindow::on_pushButton_clicked()
    {
        ......
        //给QSystemTrayIcon添加槽函数
        connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
        //建立托盘操作的菜单
        createActions();
        createMenu();
        //在系统托盘显示此对象
        mSysTrayIcon->show();
    }

    最后再看看消息球的使用
    void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
    {
        switch(reason){
        case QSystemTrayIcon::Trigger:
            //显示消息球,1s后自动消失
            //第一个参数是标题
            //第二个参数是消息内容
            //第三个参数图标
            //第四个参数是超时毫秒数
            mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                      QObject::trUtf8("欢迎使用此程序"),
                                      QSystemTrayIcon::Information,
                                      1000);
            break;
        case QSystemTrayIcon::DoubleClick:
            this->show();
            break;
        default:
            break;
        }
    }


    关于系统托盘操作的笔记就记录到此了,最后是完整代码的实现。
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #include <QMainWindow>
    #include <QSystemTrayIcon>
    #include <QMenu>
    #include <QAction>
    namespace Ui {
    class MainWindow;
    }
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    public:
        QSystemTrayIcon *mSysTrayIcon;
        QMenu *mMenu;
        QAction *mShowMainAction;
        QAction *mExitAppAction;
    public:
        void createActions();
        void createMenu();
    private slots:
        void on_pushButton_clicked();
        void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
        void on_showMainAction();
        void on_exitAppAction();
    private:
        Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QIcon>
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    void MainWindow::on_pushButton_clicked()
    {
        //隐藏主窗口
        this->hide();
        //新建QSystemTrayIcon对象
        mSysTrayIcon = new QSystemTrayIcon(this);
        //新建托盘要显示的icon
        QIcon icon = QIcon("../IMClient/Resources/GG64.png");
        //将icon设到QSystemTrayIcon对象中
        mSysTrayIcon->setIcon(icon);
        //当鼠标移动到托盘上的图标时,会显示此处设置的内容
        mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
        //给QSystemTrayIcon添加槽函数
        connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
        //建立托盘操作的菜单
        createActions();
        createMenu();
        //在系统托盘显示此对象
        mSysTrayIcon->show();
    }
    void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
    {
        switch(reason){
        case QSystemTrayIcon::Trigger:
            mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                      QObject::trUtf8("欢迎使用此程序"),
                                      QSystemTrayIcon::Information,
                                      1000);
            break;
        case QSystemTrayIcon::DoubleClick:
            this->show();
            break;
        default:
            break;
        }
    }
    void MainWindow::createActions()
    {
        mShowMainAction = new QAction(QObject::trUtf8("显示主界面"),this);
        connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
        mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
        connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
    }
    void MainWindow::createMenu()
    {
        mMenu = new QMenu(this);
        mMenu->addAction(mShowMainAction);
        mMenu->addSeparator();
        mMenu->addAction(mExitAppAction);
        mSysTrayIcon->setContextMenu(mMenu);
    }
    void MainWindow::on_showMainAction()
    {
        this->show();
    }
    void MainWindow::on_exitAppAction()
    {
        exit(0);
    }
    ————————————————
    版权声明:本文为CSDN博主「祝云飞」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhuyunfei/article/details/51433822
  • 相关阅读:
    Python OpenCV 常用操作
    Conda Cheatsheet | 速查表
    Loadrunner解决启动浏览器后页面显示空白
    26个ASP.NET常用性能优化方法
    C# Foreach用法
    体验ASP.NET MVC3 表单令牌功能!
    基于.Net(C#开发)平台的三层框架架构软件的设计与实现
    去掉浏览器中a标签的虚线
    Microsoft Dynamics CRM 4.0 序列号
    编写 Cookie
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/12513439.html
Copyright © 2011-2022 走看看