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

976

被折叠的 条评论
为什么被折叠?



