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

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

系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉。QT 提供了QSystemTrayIcon类用于实现程序的托盘。QT提供了托盘示例,在examples文件夹下面,大家可以自行研究。

下面是我自己进行实现的一个示例,主要实现的功能:

1.托盘显示,托盘图标添加;

2.托盘激活事件分发;

3.托盘菜单;

4.托盘消息,点击消息,显示主窗口。

想要显示 托盘图标,首先需要创建一个QSystemTrayIcon对象。可以给此对象设置一些信息,比如ToolTip,比如图标。需要调用show,托盘才能显示。

m_systemTray = new QSystemTrayIcon(this);
m_systemTray->setIcon(QIcon(":/SystemTray/Resources/ico.png"));
m_systemTray->setToolTip("SystemTray Program");
m_systemTray->show();

给程序添加图片资源,需要编辑.qrc文件,将图片所在的路径添加进来就可以:

<RCC>
    <qresource prefix="SystemTray">
      <file>Resources/ico.png</file>
    </qresource>
</RCC>

效果显示:

托盘激活事件,包括点击,双击,右键等。QSystemTrayIcon提供了信号给我们使用,信号的参数是激活类型,我们连接自己的槽函数就可以对类型进行分支,从而执行对应的操作:

Constant	Value	Description
QSystemTrayIcon::Unknown	0	Unknown reason
QSystemTrayIcon::Context	1	The context menu for the system tray entry was requested
QSystemTrayIcon::DoubleClick	2	The system tray entry was double clicked
QSystemTrayIcon::Trigger	3	The system tray entry was clicked
QSystemTrayIcon::MiddleClick	4	The system tray entry was clicked with the middle mouse button

连接我们自己的槽函数:

connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作

在槽函数中,分别调用了不同的函数,进行不同的操作:

void SystemTray::activeTray(QSystemTrayIcon::ActivationReason reason)
{
	switch (reason)
	{
	case QSystemTrayIcon::Context:
		showMenu();
		break;
	case QSystemTrayIcon::DoubleClick:
		showWindow();
		break;
	case QSystemTrayIcon::Trigger:
		showMessage();
		break;
	}
}

要实现菜单,我们需要创建一个QMenu并创建自己需要的QAction,添加到QMenu里面,将QMenu设置给QSystemTrayIcon既可。我们可以给每个QAction连接不同的槽函数,执行不同的操作。

	m_menu = new QMenu(this);
	m_action1 = new QAction(m_menu);
	m_action2 = new QAction(m_menu);

	m_action1->setText("Show Window");
	m_action2->setText("Show Message");

	m_menu->addAction(m_action1);
	m_menu->addAction(m_action2);

	connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);
	connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);

	m_systemTray->setContextMenu(m_menu);

菜单效果:

消息显示也很简单,QSystemTrayIcon提供了showMessage函数来显示消息窗口,此函数有四个参数,分别如下:

void SystemTray::showMessage()
{
	m_systemTray->showMessage("Information",//消息窗口标题
		"There is a new message!",//消息内容
		QSystemTrayIcon::MessageIcon::Information,//消息窗口图标
		5000);//消息窗口显示时长
}

消息效果:

QSystemTrayIcon提供了messageClicked信号,点击消息,可以触发我们自己连接的槽函数,执行我们想要实现的动作:

connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口

主窗口显示:

程序一开始主界面是隐藏的,双击托盘可以显示主窗口。

完整代码:

#ifndef SYSTEMTRAY_H
#define SYSTEMTRAY_H

#include <QtWidgets/QWidget>
#include <QSystemTrayIcon>
#include <QMenu>

class SystemTray : public QWidget
{
	Q_OBJECT

public:
	SystemTray(QWidget *parent = 0);
	~SystemTray();

protected:
	void activeTray(QSystemTrayIcon::ActivationReason reason);
	void showWindow();//显示窗体
	void showMessage();//消息框
	void showMenu();//显示菜单

private:
	QSystemTrayIcon *m_systemTray;

	QMenu *m_menu;
	QAction *m_action1;
	QAction *m_action2;
};

#endif // SYSTEMTRAY_H
#include "systemtray.h"

SystemTray::SystemTray(QWidget *parent)
	: QWidget(parent)
{
	m_systemTray = new QSystemTrayIcon(this);

	m_menu = new QMenu(this);
	m_action1 = new QAction(m_menu);
	m_action2 = new QAction(m_menu);

	m_action1->setText("Show Window");
	m_action2->setText("Show Message");

	m_menu->addAction(m_action1);
	m_menu->addAction(m_action2);

	connect(m_action1, &QAction::triggered, this, &SystemTray::showWindow);
	connect(m_action2, &QAction::triggered, this, &SystemTray::showMessage);

	m_systemTray->setContextMenu(m_menu);
	m_systemTray->setIcon(QIcon(":/SystemTray/Resources/ico.png"));
	m_systemTray->setToolTip("SystemTray Program");
	m_systemTray->show();
	connect(m_systemTray, &QSystemTrayIcon::activated, this, &SystemTray::activeTray);//点击托盘,执行相应的动作
	connect(m_systemTray, &QSystemTrayIcon::messageClicked, this, &SystemTray::showWindow);//点击消息框,显示主窗口
}

SystemTray::~SystemTray()
{

}

void SystemTray::activeTray(QSystemTrayIcon::ActivationReason reason)
{
	switch (reason)
	{
	case QSystemTrayIcon::Context:
		showMenu();
		break;
	case QSystemTrayIcon::DoubleClick:
		showWindow();
		break;
	case QSystemTrayIcon::Trigger:
		showMessage();
		break;
	}
}

void SystemTray::showMenu()
{
	m_menu->show();
}

void SystemTray::showWindow()
{
	this->show();
}

void SystemTray::showMessage()
{
	m_systemTray->showMessage("Information",//消息窗口标题
		"There is a new message!",//消息内容
		QSystemTrayIcon::MessageIcon::Information,//消息窗口图标
		5000);//消息窗口显示时长
}
#include "systemtray.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	SystemTray w;
	//w.show();
	w.hide();//初始化时,主窗口隐藏,便于观察效果
	return a.exec();
}
<RCC>
    <qresource prefix="SystemTray">
      <file>Resources/ico.png</file>
    </qresource>
</RCC>

交流 QQ:1245178753

本文地址:http://blog.csdn.net/u011417605/article/details/51322997

源码下载:http://download.csdn.net/detail/u011417605/9510891

时间: 2024-11-05 06:13:49

Qt 实现系统托盘,托盘菜单,托盘消息的相关文章

Qt实现系统托盘

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

winform最小化到托盘,托盘右击菜单显示

添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加): 主要的代码: public partial class Form1 : Form { #region //创建NotifyIcon对象 NotifyIcon notifyicon = new NotifyIcon(); //创建托盘图标对象 Icon ico = new Icon("u9.ico"); //创建托盘菜单对象 ContextMenu notifyContextMenu =

WinForm最小化到托盘以及托盘右键菜单

首先,先拖一个NotifyIcon到主窗体,然后设置NotifyIcon的图标,不然等下最小化后,都找不到那个程序了,还有那个Text也是,不写名字,就默认是NotifyIcon了..如下图: 然后双击NotifyIcon,代码如下: /// <summary> /// 添加双击托盘图标事件(双击显示窗口) /// </summary> /// <param name="sender"></param> /// <param nam

深度探索QT窗口系统(五篇)

窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口,...一个窗口可以由多个窗口组成,每天我们都在与窗口打交道,当你打开windows时,桌面就是一个窗口,你打开浏览器时,你也正在访问窗口...好了,回到今天的话题,QT窗口系统,QT是一个跨平台的框架,类似微软的MFC,Borland的OWL,前者只适用于windows,而使用QT你可以开发windows平台应用程序,你也可以开发linux应用程序,当然了你也可以

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

系统拆分解耦利器之消息队列---RabbitMQ-工作队列

[一曲广陵不如晨钟暮鼓] 本文,我们来介绍RabbitMQ中的工作队列.在正式开始之前,我们假设RabbitMQ服务已经启动,运行端口为5672,如果各位看官有更改过默认配置,那么就需要修改为对应端口,保持一致即可. 准备工作: 操作系统:window 7 x64 其他软件:eclipse mars,jdk7,maven 3 --------------------------------------------------------------------------------------

QT绘制系统简介

#3个类:QPainter,QPainterDevice 和 QPaintEngine 三个类 #qpainter用于执行绘制操作 #QPainterDevice是一个二维空间抽象,允许qpainter在其上面进行绘制,也就是qpainter工作空间 #QPaintEngine 提供了画笔(qpainter)在不同设备上进行绘制统一接口,QPaintEngine类应用于QPainter和QPaintDevice 之间,如果需要自定义一个设备时 #则不需要关心QPaintEngine 这个类的QP

【大话QT之六】QT皮肤系统的动态切换

应用需求: 提供皮肤切换选项,在不重启应用程序的情况下实现皮肤的动态切换. 理论基础: 1) 图片资源是如何被利用的 这里先简要说明一下实现原理,皮肤的动态切换其关键在于图片资源的加载方式.QT中每个应用程序启动后都会维护属于自己的资源子库,所有的图片以及UI资源都实现编译到rcc文件中,而rcc文件是整合了所有资源的二进制文件,这种方式属于动态加载. 图片是一种资源,在QT中,对于资源的使用有以下几点: 1>  一般来说:资源在内存中是用资源对象树来表示的,该树在程序启动时创建. 2>   

Qt Resource系统概说

什么是Qt Resource系统?简单的说,就是在可执行程序中存储binary文件,而且还是与平台无关的. 与Qt Resource系统密切相关的有三个法宝,分别是qmake.rcc.QFile. qmake是一种编译工具,根据developer创建的工程文件,自动生成MakeFile,简化了编译过程.qmake提供了moc和uic编译规则,专门用来支持Qt开发,其中moc是Qt元对象编译器Meta Object Compiler,uic是Qt的UI编译器User InterfaceCompil