Qt之程序最小化托盘显示及操作
2017-08-08 11:14
633 查看
转载自:http://blog.csdn.net/zhuyunfei/article/details/51433822
其中QSystemTrayIcon是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击,双击,或wheel操作(好像只对X11系统有用),显示指定消息,显示菜单等。
此类中有两个枚举类型,分别如下:
enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由:
enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片:
b) 给工程加入Qt Resource资源文件,添加一个在托盘显示的icon图片,如图:
c) 给a中的QPushButton,建立槽函数,在槽函数内实现程序最小化托盘显示:
运行程序,点击按钮最小化,可以在系统托盘看到此图标,鼠标移到上面,可以见看见代码中所设的”测试系统托盘图标”文本,如图:
a) 给QSystemTrayIcon对象添加信号为activated(QSystemTrayIcon::ActivationReason)的槽函数
b) 在槽函数内,对双击事件,显示主窗口界面
代码如下:
程序最小化后,双击托盘图标,程序的主界面可以显示了。
最后再来考虑在单击系统托盘图标时,显示菜单功能。根据上面描述,思路很明确了,如下:
a) 新建一个QMenu menu
b) 将menu通过QSystemTrayIcon的setContextMenu函数设置到QSystemTrayIcon对象中
再来看代码实现:
在头文件中新增:
在cpp中实现:
然后:
最后再看看消息球的使用:
关于系统托盘操作的笔记就记录到此了,最后是完整代码的实现:
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 | 鼠标中间按键 |
常量 | 值 | 描述 |
---|---|---|
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_exitAppA 4000 ction();
在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); }
相关文章推荐
- Qt之程序最小化托盘显示及操作
- Qt之程序最小化托盘显示及操作
- Qt之程序最小化托盘显示及操作
- Qt 最小化托盘显示
- QT小程序:利用QGraphicsScene和QGraphicsView进行显示操作
- MFC程序最小化托盘显示
- C# 托盘程序 实例 双击显示窗体,最小化到托盘
- MFC窗口程序启动时最小化到托盘、不在任务栏中显示、显示时在右小角
- 通过枚举窗口,实现最小化到托盘中程序的窗口显示
- QT5.8-程序最小化到托盘
- PB做的托盘程序(最小化后在左下角显示图标)
- C# 托盘程序 实例 双击显示窗体,最小化到托盘
- Linux下C编程-----IO/文件操作 模拟linux ls程序显示文件系统树形结构(2)
- VC最小化到托盘程序(转)
- 程序最小化到托盘 TTrayIcon
- Qt中图像的显示与基本操作
- Qt中图像的显示与基本操作
- Qt程序最小化运行,还原后窗体不刷新的问题解决
- 编译vs2008的程序总是跳过,显示“未能完成操作 未指定的错误”的解决办法 .