简单介绍
今天主要是实现了这个程序启动以后最小化到系统托盘,在系统托盘的图标上面加上显示主界面选线和退出选项,如下图:
第一版本
首先需要包含的头文件:
#include <QSystemTrayIcon> //操作系统托盘操作类 #include <QMenu> #include <QAction>
需要定义的变量:
QSystemTrayIcon *m_trayIcon = nullptr; //系统托盘类 QMenu *m_trayIconMenu = nullptr; //系统托盘菜单 QAction *m_showWindowAction = nullptr; QAction *m_exitAppAction = nullptr;
实现:
/* * 设置系统托盘内容 */ m_trayIcon = new QSystemTrayIcon(this); m_trayIcon->setIcon(QIcon(":/Images/logo.ico")); m_trayIcon->setToolTip("DateServer"); m_trayIcon->show(); /* * 创建两个Action */ m_showWindowAction = new QAction(QIcon(":/Images/logo.ico"),"显示界面",this); connect(m_showWindowAction,&QAction::triggered,this,[=](){ this->show(); }); m_exitAppAction = new QAction(QIcon(":/Images/exit.ico"),"退出程序",this); connect(m_exitAppAction,&QAction::triggered,this,[=](){ this->close(); }); /* * 创建菜单 */ m_trayIconMenu = new QMenu(this); m_trayIconMenu->addAction(m_showWindowAction); m_trayIconMenu->addSeparator(); m_trayIconMenu->addAction(m_exitAppAction); m_trayIcon->setContextMenu(m_trayIconMenu); connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){ switch (temp) { case QSystemTrayIcon::Trigger: { //单击图标时间 break; } case QSystemTrayIcon::DoubleClick: { if(this->isHidden()) { this->show(); } else { this->hide(); } break; } } });
这么写是没有问题的,功能全部可以实现,但是你,这样写现实我没有水平呀,所有内容都放在了构造函数里面,显得我的构造函数有点太长了,在加上我的这智商,只有一个函数不能同时现实出来,那就理解有困难呀,所以,还是给他们分分家比较好。
第二版本:
头文件新增内容:
void initMySystemTrayIcon(); void initMySystemTrayIconAction(); void initMySystemTrayIconMenu();
新增3个函数声明,分别用来初始化系统托盘、创建操作时间Action和创建菜单。
源文件实现:
void MainWindow::initMySystemTrayIcon() { /* * 设置系统托盘内容 */ m_trayIcon = new QSystemTrayIcon(this); m_trayIcon->setIcon(QIcon(":/Images/logo.ico")); m_trayIcon->setToolTip("DateServer"); m_trayIcon->show(); connect(m_trayIcon,&QSystemTrayIcon::activated,this,[=](QSystemTrayIcon::ActivationReason temp){ switch (temp) { case QSystemTrayIcon::Trigger: { //单击图标时间 break; } case QSystemTrayIcon::DoubleClick: { if(this->isHidden()) { this->show(); } else { this->hide(); } break; } } }); initMySystemTrayIconAction(); initMySystemTrayIconMenu(); m_trayIcon->showMessage("Tip","DataServer is running",QSystemTrayIcon::Information,5000); } void MainWindow::initMySystemTrayIconAction() { /* * 创建两个Action */ m_showWindowAction = new QAction(QIcon(":/Images/logo.ico"),"显示界面",this); connect(m_showWindowAction,&QAction::triggered,this,[=](){ this->show(); }); m_exitAppAction = new QAction(QIcon(":/Images/exit.ico"),"退出程序",this); connect(m_exitAppAction,&QAction::triggered,this,[=](){ this->close(); }); } void MainWindow::initMySystemTrayIconMenu() { /* * 创建菜单 */ m_trayIconMenu = new QMenu(this); m_trayIconMenu->addAction(m_showWindowAction); m_trayIconMenu->addSeparator(); m_trayIconMenu->addAction(m_exitAppAction); m_trayIcon->setContextMenu(m_trayIconMenu); }
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 的版本问题(专业工作站版本),原来毛病出自这里
折腾一下午,同时还要注意一个地方:
这里有可能也会阻止通知信息的弹出。