本文最后更新于:2022年5月29日 上午
版权声明:本文为CSDN博主「祝云飞」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuyunfei/article/details/51433822
一、功能说明
对于GUI程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
二、使用的类
主要使用的此类: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 |
显示致命图标 |
三、QSystemTrayIcon常用函数
1 2 3 4
| void setIcon(const QIcon& icon); void setToolTip(const QString &tip); void setContextMenu(QMenu* menu); void show();
|
四、代码
1.实现程序托盘显示
a)新建一个QWidget程序,在界面上放入一个QPushButton,text改为“最小化”,如下图:
b)给工程加入Qt Resource资源文件,添加一个在托盘显示的icon图片,如图:
c)给a中的QPushButton,建立槽函数,在槽函数内实现程序最小化托盘显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void MainWindow::on_pushButton_clicked() { this->hide();
mSysTrayIcon = new QSystemTrayIcon(this); QIcon icon = QIcon("../IMClient/Resources/GG64.png"); mSysTrayIcon->setIcon(icon); mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标")); mSysTrayIcon->show();
}
|
运行程序,点击按钮最小化,可以在系统托盘看到此图标,鼠标移到上面,可以见看见代码中所设的”测试系统托盘图标”文本,如图:
2.实现托盘图标操作
最小化后显示在系统托盘内,此时除了在任务管理器中结束此程序,无法再做其他操作,而我们还想实现双击图标显示主界面,单击图标弹出菜单等实现其他操作,此时,就需要使用QSystemTrayIcon::ActivationReason属性了。
a)给QSystemTrayIcon对象添加信号为activated(QSystemTrayIcon::ActivationReason)的槽函数;
b)在槽函数内,对双击事件,显示主窗口界面,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| void MainWindow::on_pushButton_clicked() { this->hide();
...... mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标")); 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对象中。
再来看代码实现:
在头文件中新增:
1 2 3 4 5 6 7 8 9 10 11 12
| QMenu *mMenu; QAction *mShowMainAction; QAction *mExitAppAction; ... public: void createActions(); void createMenu(); ... private slots: ... void on_showMainAction(); void on_exitAppAction();
|
在cpp中实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| 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); }
|
然后
1 2 3 4 5 6 7 8 9 10 11 12
| void MainWindow::on_pushButton_clicked() { ...... connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
createActions(); createMenu(); mSysTrayIcon->show(); }
|
最后再看看消息球的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 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; } }
|
关于系统托盘操作的笔记就记录到此了,最后是完整代码的实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #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();
mSysTrayIcon = new QSystemTrayIcon(this); QIcon icon = QIcon("../IMClient/Resources/GG64.png"); mSysTrayIcon->setIcon(icon); mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标")); 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); }
|