
使用QT创建系统托盘实际上非常简单. 为什么这么说一是因为QT文档提供了更详细的示例,其二是QT具有更优雅的结构和统一的设计风格. 但是在开始之前我们从哪里开始呢?尽管QT文档提供了更详细的示例,但由于其许,它看起来更加费劲. 在这里,我们只是拉丝,剥茧,只实现系统托盘的功能.
首先,使用QT创建器创建GUI项目,无论它是从QDialog还是QMainWindow或QWidget继承而来的. 我们以继承的QMainWindow为例. 创建完成后,创建者将自动生成一些文件. 项目文件如下:

打开主文件mainwindow.h. 在类声明中添加一些必要的成员变量,如下图所示:

其中: closeEvent()是父类中的虚函数. 我们在这里重写它,以在程序窗口关闭时实现某些操作. 然后声明一个类型为QSystemTrayIcon的指针,这是实现系统任务栏的主类. 然后声明四个类型为QAction的指针和一个类型为QMenu的指针,这两个指针将协作以实现系统任务栏的上下文菜单. 好吧,我们只需实现系统任务栏的功能,因此添加这些成员就足够了.
通常,我们会在系统托盘中看到一个小图标,指示该程序在后台运行. 然后,我们还添加一个小图标作为程序的系统托盘图标. 此步骤非常简单: 首先在源代码文件夹中创建一个子文件夹,例如命名图像. 然后在项目中添加资源文件. 打开此资源文件,您可以在右下角看到一个添加按钮qt 托盘菜单,单击添加前缀,如图所示:


添加前缀时要小心. 默认生成的前缀是: / new / prefix1. 我们将删除以下所有文本,仅保留'/'. 这是为了简单起见. 之后,再次单击“添加”按钮,这次选择“添加文件”. 在打开的文件对话框中,我们在先前创建的图像文件夹中选择一个图标,然后单击“确定”以查看结果:

添加图标的过程到此结束.
然后转到mainwindow.cpp文件以编写实际代码. 常规和窗口组件初始化代码被放入主窗口的构造函数中,以便在创建窗口时初始化必要的组件. 在这里,我们在MainWindow类中实现. 查看代码:

1 QIcon icon(":/images/sysTray.ico"); 2 systemTray = new QSystemTrayIcon(this); 3 systemTray->setIcon(icon); 4 systemTray->setToolTip("Test Radio Buttons"); 5 minimumAct = new QAction("Minimum Window", this); 6 //Note the differences between hide() and showMinimized(). 7 connect(minimumAct, SIGNAL(triggered()), this, SLOT(hide())); 8 maximumAct = new QAction("Maximum Window", this); 9 connect(maximumAct, SIGNAL(triggered()), this, SLOT(showMaximized())); 10 restoreAct = new QAction("Restore Window", this); 11 connect(restoreAct, SIGNAL(triggered()), this, SLOT(showNormal())); 12 quitAct = new QAction("Quit Application", this); 13 connect(quitAct, SIGNAL(triggered()), qApp, SLOT(quit())); 14 pContextMenu = new QMenu(this); 15 pContextMenu->addAction(minimumAct); 16 pContextMenu->addAction(maximumAct); 17 pContextMenu->addAction(restoreAct); 18 pContextMenu->addSeparator(); 19 pContextMenu->addAction(quitAct); 20 systemTray->setContextMenu(pContextMenu); 21 systemTray->show();
我们逐行说明: 第1行使用图标的文件路径生成QIcon对象,QSystemTrayIcon的setIcon使用该对象来设置系统托盘图标. 第4行设置提示信息. 该消息何时出现?这是将鼠标放在系统任务栏图标上的时候. 通常设置为程序名称. 第5至13行设置了上下文菜单项. 总共有四个项目. 分别缩小,放大,还原窗口和推出程序. 创建每个菜单项后,我们将其触发信号连接到指定的插槽功能. 第14到20行将创建的菜单项添加到上下文菜单中以完成此操作. 第21行显示此系统托盘. 这句话很重要,不能忘记. 否则,您将在系统任务栏区域中看不到该图标.
这时,功能已基本完成,程序启动时,可以在系统托盘区域看到托盘图标. 但是,如果没有将showMessage()函数添加到上述构造函数中,则不会显示托盘气球提示. 让我们模仿程序在后台运行时的提醒效果. 然后,我们只需要重写closeEvent()事件. 编写代码如下:
if(systemTray->isVisible())
{
hide();
systemTray->showMessage("Tips", "The program is running behind!");
event->ignore();
}

If语句首先判断纸盘的可见性. 由于我们在构造函数中调用了show()函数,因此系统托盘图标现在可见. 因此,输入if语句. 首先隐藏主窗口,然后调用QSystemTrayIcon的showMessage()函数以明确提醒托盘气球. 最后,调用ignore()函数以忽略事件,以防止事件继续传递. 效果如下:

功能完成后,再查看上下文菜单,看起来像:

至此qt 托盘菜单,简单的系统任务栏功能已完成.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-230369-1.html
幸亏市场上很多货在卖不然小米不好找借口
后来震撼到我了
现在是剩女多好吧