Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1468|回复: 1
打印 上一主题 下一主题

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

[复制链接]

1228

主题

1998

帖子

7598

积分

认证用户组

Rank: 5Rank: 5

积分
7598
跳转到指定楼层
楼主
发表于 2018-4-7 21:11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://blog.csdn.net/u011417605/article/details/51322997
Qt 实现系统托盘,托盘菜单,托盘消息            系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉。QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例,在examples文件夹下面,大家可以自行研究。
       下面是我自己进行实现的一个示例,主要实现的功能:
        1.托盘显示,托盘图标添加;
        2.托盘激活事件分发;

        3.托盘菜单;

        4.托盘消息,点击消息,显示主窗口。

        想要显示 托盘图标,首先需要创建一个QSystemTrayIcon对象。可以给此对象设置一些信息,比如ToolTip,比如图标。需要调用show,托盘才能显示。
[cpp] view plain copy


  • m_systemTray = new QSystemTrayIcon(this);  
  • m_systemTray->setIcon(QIcon(":/SystemTray/Resources/ico.png"));  
  • m_systemTray->setToolTip("SystemTray Program");  
  • m_systemTray->show();  

        给程序添加图片资源,需要编辑.qrc文件,将图片所在的路径添加进来就可以:

[cpp] view plain copy


  • <RCC>  
  •     <qresource prefix="SystemTray">  
  •       <file>Resources/ico.png</file>  
  •     </qresource>  
  • </RCC>  

  效果显示:



   托盘激活事件,包括点击,双击,右键等。QSystemTrayIcon提供了信号给我们使用,信号的参数是激活类型,我们连接自己的槽函数就可以对类型进行分支,从而执行对应的操作:
[cpp] view plain copy


  • Constant    Value   Description  
  • QSystemTrayIcon::Unknown    0   Unknown reason  
  • QSystemTrayIcon::Context    1   The context menu for the system tray entry was requested  
  • QSystemTrayIcon:oubleClick    2   The system tray entry was double clicked  
  • QSystemTrayIcon::Trigger    3   The system tray entry was clicked  
  • QSystemTrayIcon::MiddleClick    4   The system tray entry was clicked with the middle mouse button  

连接我们自己的槽函数:

[cpp] view plain copy


  • connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作  

在槽函数中,分别调用了不同的函数,进行不同的操作:

[cpp] view plain copy


  • void SystemTray::activeTray(QSystemTrayIcon::ActivationReason reason)  
  • {  
  •     switch (reason)  
  •     {  
  •     case QSystemTrayIcon::Context:  
  •         showMenu();  
  •         break;  
  •     case QSystemTrayIcon:oubleClick:  
  •         showWindow();  
  •         break;  
  •     case QSystemTrayIcon::Trigger:  
  •         showMessage();  
  •         break;  
  •     }  
  • }  

       要实现菜单,我们需要创建一个QMenu并创建自己需要的QAction,添加到QMenu里面,将QMenu设置给QSystemTrayIcon既可。我们可以给每个QAction连接不同的槽函数,执行不同的操作。

[cpp] view plain copy


  • m_menu = new QMenu(this);  
  • m_action1 = new QAction(m_menu);  
  • m_action2 = new QAction(m_menu);  
  •   
  • m_action1->setText("Show Window");  
  • m_action2->setText("Show Message");  
  •   
  • m_menu->addAction(m_action1);  
  • m_menu->addAction(m_action2);  
  •   
  • connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);  
  • connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);  
  •   
  • m_systemTray->setContextMenu(m_menu);  

菜单效果:



消息显示也很简单,QSystemTrayIcon提供了showMessage函数来显示消息窗口,此函数有四个参数,分别如下:
[cpp] view plain copy


  • void SystemTray::showMessage()  
  • {  
  •     m_systemTray->showMessage("Information",//消息窗口标题  
  •         "There is a new message!",//消息内容  
  •         QSystemTrayIcon::MessageIcon::Information,//消息窗口图标   
  •         5000);//消息窗口显示时长  
  • }  

消息效果:


QSystemTrayIcon提供了messageClicked信号,点击消息,可以触发我们自己连接的槽函数,执行我们想要实现的动作:

[cpp] view plain copy


  • connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口  

主窗口显示:


程序一开始主界面是隐藏的,双击托盘可以显示主窗口。

完整代码:
[cpp] view plain copy


  • #ifndef SYSTEMTRAY_H  
  • #define SYSTEMTRAY_H  
  •   
  • #include <QtWidgets/QWidget>  
  • #include <QSystemTrayIcon>  
  • #include <QMenu>  
  •   
  • class SystemTray : public QWidget  
  • {  
  •     Q_OBJECT  
  •   
  • public:  
  •     SystemTray(QWidget *parent = 0);  
  •     ~SystemTray();  
  •   
  • protected:  
  •     void activeTray(QSystemTrayIcon::ActivationReason reason);  
  •     void showWindow();//显示窗体  
  •     void showMessage();//消息框  
  •     void showMenu();//显示菜单  
  •   
  • private:  
  •     QSystemTrayIcon *m_systemTray;  
  •   
  •     QMenu *m_menu;  
  •     QAction *m_action1;  
  •     QAction *m_action2;  
  • };  
  •   
  • #endif // SYSTEMTRAY_H  

[cpp] view plain copy


  • #include "systemtray.h"  
  •   
  • SystemTray::SystemTray(QWidget *parent)  
  •     : QWidget(parent)  
  • {  
  •     m_systemTray = new QSystemTrayIcon(this);  
  •   
  •     m_menu = new QMenu(this);  
  •     m_action1 = new QAction(m_menu);  
  •     m_action2 = new QAction(m_menu);  
  •   
  •     m_action1->setText("Show Window");  
  •     m_action2->setText("Show Message");  
  •   
  •     m_menu->addAction(m_action1);  
  •     m_menu->addAction(m_action2);  
  •   
  •     connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);  
  •     connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);  
  •   
  •     m_systemTray->setContextMenu(m_menu);  
  •     m_systemTray->setIcon(QIcon(":/SystemTray/Resources/ico.png"));  
  •     m_systemTray->setToolTip("SystemTray Program");  
  •     m_systemTray->show();  
  •     connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作  
  •     connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口  
  • }  
  •   
  • SystemTray::~SystemTray()  
  • {  
  •   
  • }  
  •   
  • void SystemTray::activeTray(QSystemTrayIcon::ActivationReason reason)  
  • {  
  •     switch (reason)  
  •     {  
  •     case QSystemTrayIcon::Context:  
  •         showMenu();  
  •         break;  
  •     case QSystemTrayIcon:oubleClick:  
  •         showWindow();  
  •         break;  
  •     case QSystemTrayIcon::Trigger:  
  •         showMessage();  
  •         break;  
  •     }  
  • }  
  •   
  • void SystemTray::showMenu()  
  • {  
  •     m_menu->show();  
  • }  
  •   
  • void SystemTray::showWindow()  
  • {  
  •     this->show();  
  • }  
  •   
  • void SystemTray::showMessage()  
  • {  
  •     m_systemTray->showMessage("Information",//消息窗口标题  
  •         "There is a new message!",//消息内容  
  •         QSystemTrayIcon::MessageIcon::Information,//消息窗口图标   
  •         5000);//消息窗口显示时长  
  • }  

[cpp] view plain copy


  • #include "systemtray.h"  
  • #include <QtWidgets/QApplication>  
  •   
  • int main(int argc, char *argv[])  
  • {  
  •     QApplication a(argc, argv);  
  •     SystemTray w;  
  •     //w.show();  
  •     w.hide();//初始化时,主窗口隐藏,便于观察效果  
  •     return a.exec();  
  • }  


[cpp] view plain copy


  • <RCC>  
  •     <qresource prefix="SystemTray">  
  •       <file>Resources/ico.png</file>  
  •     </qresource>  
  • </RCC>



回复

使用道具 举报

1228

主题

1998

帖子

7598

积分

认证用户组

Rank: 5Rank: 5

积分
7598
沙发
 楼主| 发表于 2018-4-7 21:47:09 | 只看该作者
窗口置顶
  1. #ifdef Q_OS_WIN32
  2. #include <windows.h>
  3. #endif

  4. void MainWindow::showWindow()
  5. {

  6.     if (this->isMinimized())
  7.     {
  8. //        this->showNormal();
  9.         this->showMaximized();
  10.     }
  11. #ifdef Q_OS_WIN32
  12. //    SetWindowPos((HWND)winId(),HWND_TOPMOST,pos().x(),pos().y(),width(),height(),SWP_SHOWWINDOW);
  13.     //设置窗口置顶
  14.     SetWindowPos(HWND(this->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
  15.     SetWindowPos(HWND(this->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);

  16. #else
  17.     Qt::WindowFlags flags = windowFlags();
  18.     flags |= Qt::WindowStaysOnTopHint;
  19.     setWindowFlags(flags);
  20. #endif

  21.     this->show();
  22.     this->activateWindow();
  23. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-20 02:22 , Processed in 0.060161 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表