托盘程序在实际项目中的应用

目录

一、问题背景

二、QSystemTrayIcon介绍

三、实际项目中使用举例


一、问题背景

        在停车场项目中有一些岗亭在车辆正常通行无需人工介入时,可能需要一些其他操作,但是后台需要停车软件正常运行只是不显示在界面,避免影响人员工作,此时给程序加上托盘功能可以有效的解决此问题。

二、QSystemTrayIcon介绍

        QSystemTrayIcon 是 Qt 中用于实现系统托盘图标的类,常用方法包括显示/隐藏图标、设置图标与提示、显示通知消息、绑定菜单以及响应用户交互事件等。

图标与状态控制
        setIcon(const QIcon &icon)
设置托盘区域显示的图标,支持多种分辨率和主题(如 :icons/tray-dark.png)。
        setToolTip(const QString &tip)
设置鼠标悬停时的提示文本,例如显示当前状态:“停车监控服务运行中”。
        setVisible(bool visible)
控制图标是否在系统托载区可见,设为 false 可隐藏(如调试时临时关闭)。
消息通知
        showMessage(const QString &title, const QString &message, MessageIcon icon, int milliseconds)
弹出气泡提示,可用于告警提醒。支持图标类型(Information, Warning, Critical)和自定义持续时间(默认约10秒)。

菜单与交互
        setContextMenu(QMenu *menu)
绑定右键弹出菜单,通常包含“打开主界面”、“设置”、“退出”等操作项。
        信号:activated(QSystemTrayIcon::ActivationReason reason)
        当用户点击或双击图标时触发,可通过判断 reason 区分是 Trigger(单击)、DoubleClick 还是 Context(右键),实现如双击唤醒窗口的功能。

其他功能相关
        静态函数:isSystemTrayAvailable()
判断当前系统是否支持托盘功能(某些 Linux 桌面环境可能不启用),一般在初始化前调用。
        isVisible()查询图标当前是否已显示。
        geometry()获取图标在屏幕上的位置,可用于居中显示提示窗。

三、实际项目中使用举例

        实际程序中可以加入以下程序员变量和函数,在构造函数中添加createAndSetupTrayIcon创建和显示托盘。

头文件添加如下代码:

private:
	QSystemTrayIcon *trayIcon;
	QMenu *trayMenu;
	void createAndSetupTrayIcon();

具体实现如下

void ISC::createAndSetupTrayIcon() {
	// 1. 创建托盘图标菜单
	trayMenu = new QMenu(this);

	QAction *restoreAction = new QAction("显示ISC主窗口", this);
	QAction *quitAction = new QAction("退出ISC程序", this);

	trayMenu->addAction(restoreAction);
	trayMenu->addSeparator();
	trayMenu->addAction(quitAction);

	// 2. 创建托盘图标
	trayIcon = new QSystemTrayIcon(this);
	trayIcon->setIcon(QIcon(":/images/icon/ISC.ico")); // 确保资源文件中存在 :/icon.png
	trayIcon->setToolTip("ISC后台运行助手双击打开主窗口");
		trayIcon->setContextMenu(trayMenu);

	// 3. 连接信号与槽
	connect(restoreAction, &QAction::triggered, this, &PmsUpDater::show);
	connect(quitAction, &QAction::triggered, qApp, &QApplication::quit);
	connect(trayIcon, &QSystemTrayIcon::activated,
		[this](QSystemTrayIcon::ActivationReason reason) {
		if (reason == QSystemTrayIcon::DoubleClick) {
			this->show();
			this->raise();
			this->activateWindow();
			//激活当前窗口:将当前窗口置于前台,获得输入焦点,使其成为活动窗口但并不保证
			//窗口一定能获得焦点(受操作系统策略限制),配合show和raise使用确保窗口可见、置顶且激活。
		}
	});

	// 4. 显示托盘图标
	trayIcon->show();

	//显示通知消息(首次启动提示)
	trayIcon->showMessage("ISC", "ISC后台运行助手已在后台运行",
		QSystemTrayIcon::Information, 3000);
}

在事件过滤器中拦截 QEvent::Close事件或继承实现
protected::void PmsUpDater::closeEvent(QCloseEvent *event) override。

bool ISC::eventFilter(QObject*obj, QEvent*event)
{
	if (obj == this&&event->type() == QEvent::Close)
	{
		QCloseEvent*closeEvent = static_cast<QCloseEvent*>(event);
		if (m_bTaskRunning == true)
		{
			closeEvent->ignore();
			QISCMessageBox::warning(this,QString("有任务进行中,请稍后关闭程序!"));
			return true;
		}
		else
		{
			// 最小化到托盘,不退出程序
			if (trayIcon->isVisible()) {
				hide(); // 隐藏窗口
				closeEvent->ignore(); // 忽略关闭事件,防止程序退出
			}
		}
	}
	return QWidget::eventFilter(obj, event);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值