使用QT创建系统托盘
2017-05-12 11:20
357 查看
使用QT来创建一个系统托盘,事实上是一件很简单的事。为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一。但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比较详细的例子,但由于功能较多,所以看起来比较费劲。我们在这只是抽丝剥茧,只实现系统托盘这一个功能。
首先,使用QT creator创建一个GUI工程,继承于QDialog还是QMainWindow还是QWidget都无所谓。我们以继承QMainWindow为例说明。创建完毕之后,creator将自动生成一些文件,工程文件如下:
![](http://images.cnitblog.com/blog/214648/201301/25204450-b6af5fa0a4f6449388f12494554195f5.jpg)
打开头文件mainwindow.h。在类声明中添加一些必要的成员变量,如下图所示:
![](http://images.cnitblog.com/blog/214648/201301/25204721-efa67f107a7342d1ac683d08565bdffa.jpg)
其中:closeEvent()是父类中的一个虚函数。我们在这里将它重写来,以实现程序窗口关闭时的一些动作。然后后声明了一个QSystemTrayIcon类型的指针,这是实现系统托盘的一个主要类。然后声明了四个QAction类型的指针,以及一个QMenu类型的指针,它们将合作实现系统托盘的上下文菜单。好了,我们仅仅只是实现系统托盘的功能,所以添加这些成员就已经足够了。
一般,我们会看到系统托盘处都有一个小图标代表程序处于后台运行。那么,我们也添加一个小图标来作为我们程序的系统托盘图标。这一步很简单:先在源代码的文件夹中建立一个子文件夹,比如命名为images.然后在工程中添加一个资源文件。打开这个资源文件,在右边下部可以看到一个添加的按钮,点击添加前缀,如图:
![](http://images.cnitblog.com/blog/214648/201301/25210301-87fac0a35294426d992b883509a3c5f9.jpg)
添加前缀的时候要注意,默认生成的前缀是:/new/prefix1,我们把后面的文字都去掉,只保留'/'。这是为了简便处理。之后,再次点击“添加”按钮,这次选择“添加文件”。在打开的文件对话框中,我们选择先前建立的images文件夹中的一个图标,点击确定后结果如图:
![](http://images.cnitblog.com/blog/214648/201301/25210612-e6c68eba6dfd4f01aab0b25abee46f25.jpg)
添加图标的过程到此结束。
下面就转到mainwindow.cpp文件来进行实际代码的编写。一般和窗口组件初始化的代码,我们都放到主窗口的构造函数中,以便窗口在创建时就将必要的组件初始化好。这里我们就在MainWindow类中进行实现。看代码:
我们逐行进行讲解:第1行使用图标的文件路径生成一个QIcon对象,这是给QSystemTrayIcon的setIcon用的,用来设置系统托盘图标。第4行设置提示信息。这个提示信息出现在什么时候呢?就是当你的鼠标放在系统托盘图标上时,它就会出现。一般设置为程序名称。第5行到第13行设置上下文菜单项。这里总共设置了四项。分别为缩小、放大、还原窗口和推出程序。每一个菜单项在创建后,我们就将其触发信号连接到指定的槽函数。第14到20行将创建好的菜单项添加到上下文菜单中去,搞定。第21行将这个系统托盘显示出来。这一句很重要,不能忘记。否则在系统托盘区将看不到图标。
这时功能基本完成,程序在一启动时就可以在系统托盘区看到托盘图标。但是如果在上述构造函数中没有加showMessage()这个函数,将不会出现托盘气球提醒。我们就模仿程序后台运行时的提醒效果吧。那么,我们只需重写closeEvent()事件即可。如下编写代码:
if语句首先对托盘可见性进行判断。由于我们在构造函数中已经调用了show()函数,所以此时系统托盘图标是可见的。于是进入if语句。首先将主窗口进行隐藏,然后调用QSystemTrayIcon的showMessage()函数显式托盘气球提醒。最后调用ignore()函数忽略事件,以防止该事件继续传递。效果如下图:
![](http://images.cnitblog.com/blog/214648/201301/25212557-ed5f0ae6cfd5454393cce1360f67004a.jpg)
功能完成,再看看上下文菜单的样子:
![](http://images.cnitblog.com/blog/214648/201301/25212630-2f9525621bc44c818b8a4ee6c654dae3.jpg)
至此,简单的系统托盘功能完成。
968e
首先,使用QT creator创建一个GUI工程,继承于QDialog还是QMainWindow还是QWidget都无所谓。我们以继承QMainWindow为例说明。创建完毕之后,creator将自动生成一些文件,工程文件如下:
![](http://images.cnitblog.com/blog/214648/201301/25204450-b6af5fa0a4f6449388f12494554195f5.jpg)
打开头文件mainwindow.h。在类声明中添加一些必要的成员变量,如下图所示:
![](http://images.cnitblog.com/blog/214648/201301/25204721-efa67f107a7342d1ac683d08565bdffa.jpg)
其中:closeEvent()是父类中的一个虚函数。我们在这里将它重写来,以实现程序窗口关闭时的一些动作。然后后声明了一个QSystemTrayIcon类型的指针,这是实现系统托盘的一个主要类。然后声明了四个QAction类型的指针,以及一个QMenu类型的指针,它们将合作实现系统托盘的上下文菜单。好了,我们仅仅只是实现系统托盘的功能,所以添加这些成员就已经足够了。
一般,我们会看到系统托盘处都有一个小图标代表程序处于后台运行。那么,我们也添加一个小图标来作为我们程序的系统托盘图标。这一步很简单:先在源代码的文件夹中建立一个子文件夹,比如命名为images.然后在工程中添加一个资源文件。打开这个资源文件,在右边下部可以看到一个添加的按钮,点击添加前缀,如图:
![](http://images.cnitblog.com/blog/214648/201301/25210301-87fac0a35294426d992b883509a3c5f9.jpg)
添加前缀的时候要注意,默认生成的前缀是:/new/prefix1,我们把后面的文字都去掉,只保留'/'。这是为了简便处理。之后,再次点击“添加”按钮,这次选择“添加文件”。在打开的文件对话框中,我们选择先前建立的images文件夹中的一个图标,点击确定后结果如图:
![](http://images.cnitblog.com/blog/214648/201301/25210612-e6c68eba6dfd4f01aab0b25abee46f25.jpg)
添加图标的过程到此结束。
下面就转到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()函数忽略事件,以防止该事件继续传递。效果如下图:
![](http://images.cnitblog.com/blog/214648/201301/25212557-ed5f0ae6cfd5454393cce1360f67004a.jpg)
功能完成,再看看上下文菜单的样子:
![](http://images.cnitblog.com/blog/214648/201301/25212630-2f9525621bc44c818b8a4ee6c654dae3.jpg)
至此,简单的系统托盘功能完成。
968e
相关文章推荐
- 使用QT创建系统托盘
- 使用QT创建系统托盘
- 使用QT创建系统托盘
- c# winform 系统托盘图标的创建与简单使用
- c# winform 系统托盘图标的创建与简单使用
- 创建QT系统托盘图标
- Qt5 创建系统托盘
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 3)
- LINUX系统中动态链接库的创建与使用
- 使用Debian的kernel-package系统创建自己的内核
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1)
- LINUX系统中动态链接库的创建与使用
- 使用.NET创建Windows系统服务及安装完全教程(收藏)
- 使用Visual Studio.Net,系统报告“automation服务器不能创建对象”错误。解决之道运行:regsvr32 scrrun.dll 就可以了。
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1)
- 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 2)
- 使用NotifyIcon控件创建任务栏托盘
- 企业信息化系统基础——AD:使用C#批量创建帐号
- 使用.NET 创建Windows系统服务及安装完全教程
- LINUX系统中动态链接库的创建与使用