Qt 数据服务器、协议转换、系统托盘模块、CAN总线模块、反射内存卡模块

举报
DreamLife 发表于 2022/04/15 23:47:52 2022/04/15
【摘要】 简单介绍 这个程序也不怎么复杂,就则一个界面,核心功能呢就是提供反射内存卡和CAN采集卡数据交互,其他的没有了。 今天主要是实现了这个程序启动以后最小化到系统托盘,在系统托盘的图标上面加上显示主界面选线和退出选项,如下图: 第一版本 首先需要包含的头文件: #include <QSystemTrayIcon&...

简单介绍

这个程序也不怎么复杂,就则一个界面,核心功能呢就是提供反射内存卡和CAN采集卡数据交互,其他的没有了。

今天主要是实现了这个程序启动以后最小化到系统托盘,在系统托盘的图标上面加上显示主界面选线和退出选项,如下图:

第一版本

首先需要包含的头文件:


  
  1. #include <QSystemTrayIcon> //操作系统托盘操作类
  2. #include <QMenu>
  3. #include <QAction>

需要定义的变量:


  
  1. QSystemTrayIcon *m_trayIcon = nullptr; //系统托盘类
  2. QMenu *m_trayIconMenu = nullptr; //系统托盘菜单
  3. QAction *m_showWindowAction = nullptr;
  4. QAction *m_exitAppAction = nullptr;

实现:


  
  1. /*
  2. * 设置系统托盘内容
  3. */
  4. m_trayIcon = new QSystemTrayIcon(this);
  5. m_trayIcon->setIcon(QIcon(":/Images/logo.ico"));
  6. m_trayIcon->setToolTip("DateServer");
  7. m_trayIcon->show();
  8. /*
  9. * 创建两个Action
  10. */
  11. m_showWindowAction = new QAction(QIcon(":/Images/logo.ico"),"显示界面",this);
  12. connect(m_showWindowAction,&QAction::triggered,this,[=](){
  13. this->show();
  14. });
  15. m_exitAppAction = new QAction(QIcon(":/Images/exit.ico"),"退出程序",this);
  16. connect(m_exitAppAction,&QAction::triggered,this,[=](){
  17. this->close();
  18. });
  19. /*
  20. * 创建菜单
  21. */
  22. m_trayIconMenu = new QMenu(this);
  23. m_trayIconMenu->addAction(m_showWindowAction);
  24. m_trayIconMenu->addSeparator();
  25. m_trayIconMenu->addAction(m_exitAppAction);
  26. m_trayIcon->setContextMenu(m_trayIconMenu);
  27. connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){
  28. switch (temp) {
  29. case QSystemTrayIcon::Trigger:
  30. {
  31. //单击图标时间
  32. break;
  33. }
  34. case QSystemTrayIcon::DoubleClick:
  35. {
  36. if(this->isHidden())
  37. {
  38. this->show();
  39. }
  40. else
  41. {
  42. this->hide();
  43. }
  44. break;
  45. }
  46. }
  47. });

这么写是没有问题的,功能全部可以实现,但是你,这样写现实我没有水平呀,所有内容都放在了构造函数里面,显得我的构造函数有点太长了,在加上我的这智商,只有一个函数不能同时现实出来,那就理解有困难呀,所以,还是给他们分分家比较好。

第二版本:

头文件新增内容:


  
  1. void initMySystemTrayIcon();
  2. void initMySystemTrayIconAction();
  3. void initMySystemTrayIconMenu();

新增3个函数声明,分别用来初始化系统托盘、创建操作时间Action和创建菜单。

源文件实现:


  
  1. void MainWindow::initMySystemTrayIcon()
  2. {
  3. /*
  4. * 设置系统托盘内容
  5. */
  6. m_trayIcon = new QSystemTrayIcon(this);
  7. m_trayIcon->setIcon(QIcon(":/Images/logo.ico"));
  8. m_trayIcon->setToolTip("DateServer");
  9. m_trayIcon->show();
  10. connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){
  11. switch (temp) {
  12. case QSystemTrayIcon::Trigger:
  13. {
  14. //单击图标时间
  15. break;
  16. }
  17. case QSystemTrayIcon::DoubleClick:
  18. {
  19. if(this->isHidden())
  20. {
  21. this->show();
  22. }
  23. else
  24. {
  25. this->hide();
  26. }
  27. break;
  28. }
  29. }
  30. });
  31. initMySystemTrayIconAction();
  32. initMySystemTrayIconMenu();
  33. m_trayIcon->showMessage("Tip","DataServer is running",QSystemTrayIcon::Information,5000);
  34. }
  35. void MainWindow::initMySystemTrayIconAction()
  36. {
  37. /*
  38. * 创建两个Action
  39. */
  40. m_showWindowAction = new QAction(QIcon(":/Images/logo.ico"),"显示界面",this);
  41. connect(m_showWindowAction,&QAction::triggered,this,[=](){
  42. this->show();
  43. });
  44. m_exitAppAction = new QAction(QIcon(":/Images/exit.ico"),"退出程序",this);
  45. connect(m_exitAppAction,&QAction::triggered,this,[=](){
  46. this->close();
  47. });
  48. }
  49. void MainWindow::initMySystemTrayIconMenu()
  50. {
  51. /*
  52. * 创建菜单
  53. */
  54. m_trayIconMenu = new QMenu(this);
  55. m_trayIconMenu->addAction(m_showWindowAction);
  56. m_trayIconMenu->addSeparator();
  57. m_trayIconMenu->addAction(m_exitAppAction);
  58. m_trayIcon->setContextMenu(m_trayIconMenu);
  59. }

QSystemTrayIcon:

以上就是今天系统托盘的内容,今天的知识点主要就是“QSystemTrayIcon”。看下官方的描述:

“Modern operating systems usually provide a special area on the desktop, called the system tray or notification area, where long-running applications can display icons and short messages.”

大致翻译呢,就是现在操作系统通常会提在桌面上提供一个特殊的区域,我们把这个区域称为系统托盘或通知区域,长期运行的应用程序可以在这里显示图标和信息。

对这个类更详细的内容,大家可以自行百度“QSystemTrayIcon”或直接在Qt的帮助文档中查找该类即可。

 

解决托盘栏消息不弹出问题:

中间有个小插曲,我看发现我在启动了托盘类ShowMessage()这个函数的时候,电脑没有任何反应,我还以为是我的代码问题,或者是win10 的版本问题(专业工作站版本),原来毛病出自这里

折腾一下午,同时还要注意一个地方:

这里有可能也会阻止通知信息的弹出。

 

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/108435516

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。