Qt之程序最小化托盘显示及操作

来源:互联网 发布:手机知乎怎么查看问题 编辑:程序博客网 时间:2024/05/16 12:46

转载自:http://blog.csdn.net/zhuyunfei/article/details/51433822


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_OBJECTpublic:    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);}
原创粉丝点击