QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例

suoniao 2020-10-20
需要:0索币
 系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉。QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例,在examples文件夹下面,大家可以自行研究。
       下面是我自己进行实现的一个示例,主要实现的功能:
        1.托盘显示,托盘图标添加;
        2.托盘激活事件分发;
        3.托盘菜单;
        4.托盘消息,点击消息,显示主窗口。
        想要显示 托盘图标,首先需要创建一个 QSystemTrayIcon对象。可以给此对象设置一些信息,比如ToolTip,比如图标。需要调用show,托盘才能显示。
  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文件,将图片所在的路径添加进来就可以:
  1. <RCC>
  2. <qresource prefix="SystemTray">
  3. <file>Resources/ico.png</file>
  4. </qresource>
  5. </RCC>
  效果显示:

   托盘激活事件,包括点击,双击,右键等。 QSystemTrayIcon提供了信号给我们使用,信号的参数是激活类型,我们连接自己的槽函数就可以对类型进行分支,从而执行对应的操作:
  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
连接我们自己的槽函数:
connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作
在槽函数中,分别调用了不同的函数,进行不同的操作:
  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连接不同的槽函数,执行不同的操作。
  1. m_menu = new QMenu(this);
  2. m_action1 = new QAction(m_menu);
  3. m_action2 = new QAction(m_menu);
  4. m_action1->setText("Show Window");
  5. m_action2->setText("Show Message");
  6. m_menu->addAction(m_action1);
  7. m_menu->addAction(m_action2);
  8. connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);
  9. connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);
  10. m_systemTray->setContextMenu(m_menu);
 菜单效果: 

 消息显示也很简单,QSystemTrayIcon提供了showMessage函数来显示消息窗口,此函数有四个参数,分别如下:
  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信号,点击消息,可以触发我们自己连接的槽函数,执行我们想要实现的动作:
connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口
主窗口显示:

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

  1. <RCC>
  2. <qresource prefix="SystemTray">
  3. <file>Resources/ico.png</file>
  4. </qresource>
  5. </RCC>

交流 QQ:1245178753

原文地址 https://blog.csdn.net/u011417605/article/details/51322997

回帖
  • 消灭零回复
广告一下
程序员转型,副业赚钱教程
相关主题
Qt实战分布式网盘系统实战Qt文件上传下载 0
Qt5实战教程之翻金币游戏开发 0
利用C++库QT实现秘钥分发系统 秘钥协商 校验 查看服务 0
Qt开发物联网智能网关项目教程 0
Qt开发打地鼠游戏实战 QT学生管理系统实战教程 0
socket notifiers cannot be enabled from another thread错误 0
QProcess::startDetached("cmd.exe")不显示控制台窗口 0
Qt的半自动化内存管理 0
Qt智能指针则可以在退出作用域时智能指针则可以在退出作用域时 0
Qt垃圾回收机制QObjectCleanupHandler 0
QT中建议不要直接Delete掉一个QObject使用deleteLater()函数 0
未找到文件qmlcache_loader.cpp QT编译release版本的时候报错 0
Qt5.12.4requested database does not belong to the calling thread 0
构建Qt界面的工具栏,主要用到QToolBar类 0
QToolButton详细使用图解教程 给主界面添加图标和文字 0
Qt利用QClipboard复制hello suoniao到剪贴板 0
Qt剪切板复制图片和文本的方法将QImage格式复制到剪贴板,QPixmap要比QImage慢 0
QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例 0
mainwindow单击关闭按钮不会触发关闭操作,它只是退出 0
addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed 0
相关主题
Qt实战分布式网盘系统实战Qt文件上传下载 0
Qt5实战教程之翻金币游戏开发 0
利用C++库QT实现秘钥分发系统 秘钥协商 校验 查看服务 0
最新C++入门到实战教程 c++实现计算器和QQ登录框 0
Qt开发物联网智能网关项目教程 0
Qt开发打地鼠游戏实战 QT学生管理系统实战教程 0
大龄程序员转型、程序员副业赚钱实战教程合集 0
程序员副业赚钱之抖音短视频制作实战教程 0
程序员副业赚钱之程序员投资赚钱实战教程 0
程序员副业赚钱之利用抖音短视频获取收入实战 0
程序员副业赚钱之抖音电商实战教程 0
程序员副业赚钱之利用豆瓣引流赚钱实战 0
程序员副业赚钱之抓住自媒体风口月入过万不是问题今日头条实战 0
程序员副业赚钱之靠搬运视频赚钱实战 0
程序员副业赚钱之靠写作技术文章实现收益 写作教程 0
程序员副业赚钱之利用知乎引流实现月入过万实战 0
程序员副业赚钱之利用个人IP打造月入5万项目 0
程序员副业赚钱之利用社群营销 打造躺赚个人号 0
程序员副业赚钱之靠运行公众号月入10万多哦 0
程序员副业赚钱之打造一个赚钱的快手号 0