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

  

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

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

时间: 2024-10-10 10:04:10

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

Qt实现系统托盘

        平时大多数看到的软件都是带系统托盘的,这样软件可以在后台运行,挺好的.今天看了下Qt自带的demon,中间有参考了下,实现了这个小小的功能,就将这个功能添加到了自己之前的一个项目中,效果蛮好的.界面如下所示: 右击系统托盘就会显示当前设定的各个菜单功能: 怎么样,效果还好吧.实现这个小功能厅满意的.右键点击弹出的菜单可以自行设定所需的.另外可以设定鼠标单击.双击.中间键分别按下时所触发的动作.主要代码如下所示: 1.首先需要添加头文件,Qsystem/trayIcon类.QMen

Qt 实现系统托盘,托盘菜单,托盘消息

Qt 实现系统托盘,托盘菜单,托盘消息 系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉.QT 提供了QSystemTrayIcon类用于实现程序的托盘.QT提供了托盘示例,在examples文件夹下面,大家可以自行研究. 下面是我自己进行实现的一个示例,主要实现的功能: 1.托盘显示,托盘图标添加: 2.托盘激活事件分发: 3.托盘菜单: 4.托盘消息,点击消息,显示主窗口. 想要显示 托盘图标,首先需要创建一个QSystemTrayIcon对象.可以给此对象设置一些信息,比如

Qt系统托盘

Qt的系统托盘的使用,可比mfc中好多了!他封装了一个专门的QSystemTrayIcon类,建立系统托盘图标.其实在Qt提供的示例程序已经很不错了,$QTDIR\examples\desktop\systray在这里简单的实现一个系统托盘功能,对其系统托盘类的使用做以演示. #include <QtGui>class Window: public QWidget{    Q_OBJECT        public:    Window(); private:    void showMes

Qt 系统托盘(加hover效果)

最近项目需要添加系统托盘,本来Qt的QSystemTrayIcon可以实现的,但是要求要添加hover效果,并显示未读消息(就和qq的托盘差不多,移动上去显示未读列表),加了这个要求QSystemTrayIcon就没法实现了,最后使用的是NOTIFYICONDATA实现的,记录下. 1.创建一个系统托盘: NOTIFYICONDATA m_nid; CMsgTrayPos m_traypos; QLabel *m_pSysIcon; qApp->installNativeEventFilter(

【Qt编程】系统托盘的显示

本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选择QMainWindow,类名也选择默认的mainwindow.这时,工程项目中就有3个文件(界面文件不用管):mainwindow.h mainwindow.cpp main.cpp.然后,分别修改3个文件如下: 1.mainwindow.h #ifndef MAINWINDOW_H #defin

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

概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo实现功能: 1.应用启动后,任务栏,系统托盘可以看到该程序. 2.点击右上角×关闭窗口,自动隐藏窗口,托盘可以看到该程序. 3.鼠标在托盘图标上右键,弹出"退出程序"菜单栏,并带有图标. 步骤: 1.工程中新建TrayDialog类,基类是QDialog,在界面上添加Text Browse

Qt之自定义托盘

说起Qt,真是个不错的ui库,不仅仅ui做的好,其他方便也不差,在扩平台方便也是非常的强大.这篇文章我将会分析下qt的托盘,QSystemTrayIcon是qt的托盘类,托盘类的用途是什么我就不说了,自行百科就好,关键问题是我们要实现怎么的托盘. 说起常用的客户端软件,qq,微信等聊天工具,有这么几个托盘事件: 1.来消息图标闪烁 2.气泡消息提示 3.鼠标左键单击.左键双击.右键单击.滚动单击 上述这三种事件QSystemTrayIcon类都完全能够解决,但是托盘的hover事件却无能为力,如

Qt之自定义托盘(二)

上一篇文章讲述了自定义Qt托盘,不过不是使用QSystemTrayIcon这个类,而是我们自己完全自定义的一个类,我们只需要处理这个类的鼠标hover.鼠标左键点击.鼠标右键点击和鼠标左键双击,就可以完全模拟出qq的托盘样式来.文章的最后我也是提供了一个demo的下载链接,那是一个可以完全运行的demo,处理了鼠标hover事件,并模拟出了鼠标离开和进入事件,这一节我将一步一步讲解怎么实现一个完美的托盘,包括托盘菜单的显示.托盘tooltip和托盘hover时的弹框显示. 看本片文章之前,同学们

Qt plugin系统的几点说明

对于一个大型软件系统来说,实现plugin是一件很美妙的事情,一个成功的plugin系统可以使软件增色不少.Plugin最大的功能是在一定程度内提高了软件的灵活度和可扩展性.一个设计精良的server软件plugin系统甚至在server程序不退出的情况下可以调用新加入的plugin,实现不间断服务的升级.那么,Qt是怎样实现它的plugin系统呢? 使用Qt创建plugin和在程序中调用plugin是很简单的事情,Qt提供了很多helper class供大家使用.总体来说,Qt的plugin分