使用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()函数忽略事件,以防止该事件继续传递。效果如下图:

  

功能完成,再看看上下文菜单的样子:

至此,简单的系统托盘功能完成。

使用QT创建系统托盘的更多相关文章

  1. 用Qt写软件系列四:定制个性化系统托盘菜单

    导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...

  2. QT系统托盘应用程序

    在QT中QSystemTrayIcon类提供了创建系统托盘程序的功能. QSystemTrayIcon类为系统托盘中的应用程序提供图标.现代操作系统通常会在桌面上提供一个称为系统托盘(system t ...

  3. Qt系统托盘

    Qt的系统托盘的使用,可比mfc中好多了!他封装了一个专门的QSystemTrayIcon类,建立系统托盘图标.其实在Qt提供的示例程序已经很不错了,$QTDIR\examples\desktop\s ...

  4. QT中自定义系统托盘的实现—c++语言为例

    将要介绍的是:QT中自定义系统托盘(systemtray)的一个Demo,希望能帮需要的读者快速上手. 前提假设是诸位已经知道QT中的signals .slot以及资源文件,所以关于这些不会再累述. ...

  5. 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示

    本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...

  6. 【Qt开发】实现系统托盘,托盘菜单,托盘消息

    概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...

  7. Qt之自定义托盘(二)

    上一篇文章讲述了自定义Qt托盘,不过不是使用QSystemTrayIcon这个类,而是我们自己完全自定义的一个类,我们只需要处理这个类的鼠标hover.鼠标左键点击.鼠标右键点击和鼠标左键双击,就可以 ...

  8. Qt之自定义托盘

    说起Qt,真是个不错的ui库,不仅仅ui做的好,其他方面也不差,在平台扩展方面也是非常的强大.这篇文章我将会分析下qt的托盘,QSystemTrayIcon是qt的托盘类,托盘类的用途是什么我就不说了 ...

  9. 将 VMware 最小化到系统托盘

    1, 下载 Trayconizer官网地址: http://www.whitsoftdev.com/trayconizer/下载地址: http://www.whitsoftdev.com/files ...

随机推荐

  1. Python 字符串与列表去重

    最近面试中出现频率比较高的字符串和列表的去重pstr = 'abcadcf'# 字符串去重# 1.使用集合 --没有保持原来的顺序 print(set(pstr)) # 2.使用字典 -- 没有保持原 ...

  2. 系统编码 python编码

    编码一直都是一个很让人头疼的问题,尤其是在python里面.花了几天时间,终于把这个问题给弄明白了. 一,什么是编码,编码过程是怎样的?常见的编码方式有哪些? 编码是从一个字符,比如'哈',到一段二进 ...

  3. WAMP搭建与配置

    使用WampServer整合软件包进行WAMP环境搭建 WampServer是一款由法国人开发的Apache Web服务器.PHP解释器以及MySQL数据库的整合软件包.免去了开发人员将时间花费在繁琐 ...

  4. IntlliJ IDEA 注册码获取或离线破解

    JB 的软件还是挺好用的,建议有钱的话支持正版.. IntelliJ IDEA 有开源版,但是要想玩企业级开发,还是得用收费版. 不管哪种方式,使用前都需要把"0.0.0.0 account ...

  5. storm集群环境搭建

    1.环境 Java环境 卸载虚机环境中自带的openJdk,安装sun的jdk,配置环境变量 2.安装storm 下载storm安装包 解压到安装目录,配置环境变量 vi /etc/profile # ...

  6. CSS3——提示工具 图片廓 图像透明 图像拼接技术 媒体类型 属性选择器

    提示工具 提示框在鼠标移动到特定的元素上显示 设置提示框的位置 给提示框添加箭头 提示框的淡入效果 提示框美化 图片廓 响应式图片廓 图像透明 创建透明图像——悬停效果 ———鼠标放置后———> ...

  7. TCP/IP笔记——UDP

    OSI模型中最下面的两层用来解决两个硬件设备在物理上的通信问题(如规定怎么将电平信号转换为数字信号),相对应的TCP/IP模型中,这部分代表将会将机器封装为一个MAC地址来实现通讯.网络层是关于,具体 ...

  8. PHP操作SESSION

    说一下在PHP里面怎么简单的操作SESSION 操作SESSION流程 <?php session_start(); //开启session $_SESSION['user']='admin'; ...

  9. 20191127 Spring Boot官方文档学习(4.11)

    4.11.使用NoSQL技术 Spring Data提供了其他项目来帮助您访问各种NoSQL技术,包括: Redis MongoDB Neo4J Solr Elasticsearch Cassandr ...

  10. [转帖]华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz

    华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz https://www.cnbeta.com/articles/tech/850561.htm 中电科旗下的普华软件 支持国 ...