使用QT创建系统托盘
使用QT来创建一个系统托盘,事实上是一件很简单的事。为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一。但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比较详细的例子,但由于功能较多,所以看起来比较费劲。我们在这只是抽丝剥茧,只实现系统托盘这一个功能。
首先,使用QT creator创建一个GUI工程,继承于QDialog还是QMainWindow还是QWidget都无所谓。我们以继承QMainWindow为例说明。创建完毕之后,creator将自动生成一些文件,工程文件如下:
打开头文件mainwindow.h。在类声明中添加一些必要的成员变量,如下图所示:
其中:closeEvent()是父类中的一个虚函数。我们在这里将它重写来,以实现程序窗口关闭时的一些动作。然后后声明了一个QSystemTrayIcon类型的指针,这是实现系统托盘的一个主要类。然后声明了四个QAction类型的指针,以及一个QMenu类型的指针,它们将合作实现系统托盘的上下文菜单。好了,我们仅仅只是实现系统托盘的功能,所以添加这些成员就已经足够了。
一般,我们会看到系统托盘处都有一个小图标代表程序处于后台运行。那么,我们也添加一个小图标来作为我们程序的系统托盘图标。这一步很简单:先在源代码的文件夹中建立一个子文件夹,比如命名为images.然后在工程中添加一个资源文件。打开这个资源文件,在右边下部可以看到一个添加的按钮,点击添加前缀,如图:
添加前缀的时候要注意,默认生成的前缀是:/new/prefix1,我们把后面的文字都去掉,只保留'/'。这是为了简便处理。之后,再次点击“添加”按钮,这次选择“添加文件”。在打开的文件对话框中,我们选择先前建立的images文件夹中的一个图标,点击确定后结果如图:
添加图标的过程到此结束。
下面就转到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()函数忽略事件,以防止该事件继续传递。效果如下图:
功能完成,再看看上下文菜单的样子:
至此,简单的系统托盘功能完成。
- linux (ubantu)安装最新版python3.6,以及直接安装anaconda
- 【java基础】匿名类
- 朴素贝叶斯法 2016年11月11日
- 11g中关于控制文件自动备份的改进(r6笔记第22天)
- Java基础(02)-15总结对象数组,集合Collection,集合List
- alert日志中的两种ORA错误分析(r6笔记第21天)
- 通过定制orabbix监控分析潜在的Oracle问题 (r6笔记第32天)
- 【C语言练手】C语言画太极图
- 关于奇怪的并行进程分析(一) (r6笔记第41天)
- 关于ora-02391问题的总结(r6笔记第40天)
- 一次数据库响应慢的问题诊断(r6笔记第39天)
- 贝叶斯分类器及Python实现
- R语言中文分词工具
- orabbix结合python发送图形报表(二) (r6笔记第38天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Alink漫谈(二十一) :回归评估之源码分析
- Linux环境下通过GDB调试C项目实战
- Alink漫谈(二十二) :源码分析之聚类评估
- Python3.x将代码打包成exe程序并添加图标
- 在tinycolinux上编译pypy和hippyvm
- IDEA 热部署配置 HotSwapAgent-IntelliJ-IDEA-plugin
- 在tinycolinux上编译odoo8
- 在tinycolinux上编译jupyter和rootcling组建混合cpp,python学习环境
- 110分钟使用Python搭建自己的IP定位查询接口
- python实现在线微博数据可视化
- 在tinycolinux上安装chrome
- 如何在Ubuntu 18.04服务器上安装Python 3和设置编程环境
- python趣味题-数字加密
- 快手解析视频真实链接(爬取快手视频)
- 在tinycolinux上安装和使用cloudwall