Qt 实现系统托盘,托盘菜单,托盘消息

Qt 实现系统托盘,托盘菜单,托盘消息

             系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉。QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例,在examples文件夹下面,大家可以自行研究。
       下面是我自己进行实现的一个示例,主要实现的功能:
        1.托盘显示,托盘图标添加;
        2.托盘激活事件分发;
        3.托盘菜单;
        4.托盘消息,点击消息,显示主窗口。
        想要显示 托盘图标,首先需要创建一个 QSystemTrayIcon对象。可以给此对象设置一些信息,比如ToolTip,比如图标。需要调用show,托盘才能显示。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. m_systemTray = new QSystemTrayIcon(this);  
  2. m_systemTray->setIcon(QIcon(":/SystemTray/Resources/ico.png"));  
  3. m_systemTray->setToolTip("SystemTray Program");  
  4. m_systemTray->show();  
        给程序添加图片资源,需要编辑.qrc文件,将图片所在的路径添加进来就可以:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <RCC>  
  2.     <qresource prefix="SystemTray">  
  3.       <file>Resources/ico.png</file>  
  4.     </qresource>  
  5. </RCC>  
  效果显示:

   托盘激活事件,包括点击,双击,右键等。 QSystemTrayIcon提供了信号给我们使用,信号的参数是激活类型,我们连接自己的槽函数就可以对类型进行分支,从而执行对应的操作:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Constant    Value   Description  
  2. QSystemTrayIcon::Unknown    0   Unknown reason  
  3. QSystemTrayIcon::Context    1   The context menu for the system tray entry was requested  
  4. QSystemTrayIcon::DoubleClick    2   The system tray entry was double clicked  
  5. QSystemTrayIcon::Trigger    3   The system tray entry was clicked  
  6. QSystemTrayIcon::MiddleClick    4   The system tray entry was clicked with the middle mouse button  
连接我们自己的槽函数:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作  
在槽函数中,分别调用了不同的函数,进行不同的操作:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void SystemTray::activeTray(QSystemTrayIcon::ActivationReason reason)  
  2. {  
  3.     switch (reason)  
  4.     {  
  5.     case QSystemTrayIcon::Context:  
  6.         showMenu();  
  7.         break;  
  8.     case QSystemTrayIcon::DoubleClick:  
  9.         showWindow();  
  10.         break;  
  11.     case QSystemTrayIcon::Trigger:  
  12.         showMessage();  
  13.         break;  
  14.     }  
  15. }  
       要实现菜单,我们需要创建一个QMenu并创建自己需要的QAction,添加到QMenu里面,将QMenu设置给QSystemTrayIcon既可。我们可以给每个QAction连接不同的槽函数,执行不同的操作。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. m_menu = new QMenu(this);  
  2. m_action1 = new QAction(m_menu);  
  3. m_action2 = new QAction(m_menu);  
  4.   
  5. m_action1->setText("Show Window");  
  6. m_action2->setText("Show Message");  
  7.   
  8. m_menu->addAction(m_action1);  
  9. m_menu->addAction(m_action2);  
  10.   
  11. connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);  
  12. connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);  
  13.   
  14. m_systemTray->setContextMenu(m_menu);  
 菜单效果: 

 消息显示也很简单,QSystemTrayIcon提供了showMessage函数来显示消息窗口,此函数有四个参数,分别如下:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void SystemTray::showMessage()  
  2. {  
  3.     m_systemTray->showMessage("Information",//消息窗口标题  
  4.         "There is a new message!",//消息内容  
  5.         QSystemTrayIcon::MessageIcon::Information,//消息窗口图标   
  6.         5000);//消息窗口显示时长  
  7. }  
消息效果:

 QSystemTrayIcon提供了messageClicked信号,点击消息,可以触发我们自己连接的槽函数,执行我们想要实现的动作:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口  
主窗口显示:

 程序一开始主界面是隐藏的,双击托盘可以显示主窗口。
完整代码:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #ifndef SYSTEMTRAY_H  
  2. #define SYSTEMTRAY_H  
  3.   
  4. #include <QtWidgets/QWidget>  
  5. #include <QSystemTrayIcon>  
  6. #include <QMenu>  
  7.   
  8. class SystemTray : public QWidget  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     SystemTray(QWidget *parent = 0);  
  14.     ~SystemTray();  
  15.   
  16. protected:  
  17.     void activeTray(QSystemTrayIcon::ActivationReason reason);  
  18.     void showWindow();//显示窗体  
  19.     void showMessage();//消息框  
  20.     void showMenu();//显示菜单  
  21.   
  22. private:  
  23.     QSystemTrayIcon *m_systemTray;  
  24.   
  25.     QMenu *m_menu;  
  26.     QAction *m_action1;  
  27.     QAction *m_action2;  
  28. };  
  29.   
  30. #endif // SYSTEMTRAY_H  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "systemtray.h"  
  2.   
  3. SystemTray::SystemTray(QWidget *parent)  
  4.     : QWidget(parent)  
  5. {  
  6.     m_systemTray = new QSystemTrayIcon(this);  
  7.   
  8.     m_menu = new QMenu(this);  
  9.     m_action1 = new QAction(m_menu);  
  10.     m_action2 = new QAction(m_menu);  
  11.   
  12.     m_action1->setText("Show Window");  
  13.     m_action2->setText("Show Message");  
  14.   
  15.     m_menu->addAction(m_action1);  
  16.     m_menu->addAction(m_action2);  
  17.   
  18.     connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);  
  19.     connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);  
  20.   
  21.     m_systemTray->setContextMenu(m_menu);  
  22.     m_systemTray->setIcon(QIcon(":/SystemTray/Resources/ico.png"));  
  23.     m_systemTray->setToolTip("SystemTray Program");  
  24.     m_systemTray->show();  
  25.     connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作  
  26.     connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口  
  27. }  
  28.   
  29. SystemTray::~SystemTray()  
  30. {  
  31.   
  32. }  
  33.   
  34. void SystemTray::activeTray(QSystemTrayIcon::ActivationReason reason)  
  35. {  
  36.     switch (reason)  
  37.     {  
  38.     case QSystemTrayIcon::Context:  
  39.         showMenu();  
  40.         break;  
  41.     case QSystemTrayIcon::DoubleClick:  
  42.         showWindow();  
  43.         break;  
  44.     case QSystemTrayIcon::Trigger:  
  45.         showMessage();  
  46.         break;  
  47.     }  
  48. }  
  49.   
  50. void SystemTray::showMenu()  
  51. {  
  52.     m_menu->show();  
  53. }  
  54.   
  55. void SystemTray::showWindow()  
  56. {  
  57.     this->show();  
  58. }  
  59.   
  60. void SystemTray::showMessage()  
  61. {  
  62.     m_systemTray->showMessage("Information",//消息窗口标题  
  63.         "There is a new message!",//消息内容  
  64.         QSystemTrayIcon::MessageIcon::Information,//消息窗口图标   
  65.         5000);//消息窗口显示时长  
  66. }  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "systemtray.h"  
  2. #include <QtWidgets/QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     SystemTray w;  
  8.     //w.show();  
  9.     w.hide();//初始化时,主窗口隐藏,便于观察效果  
  10.     return a.exec();  
  11. }  

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <RCC>  
  2.     <qresource prefix="SystemTray">  
  3.       <file>Resources/ico.png</file>  
  4.     </qresource>  
  5. </RCC>  
交流 QQ:1245178753

猜你喜欢

转载自blog.csdn.net/syrchina/article/details/64440256