Qt系统托盘与可执行程序图标
Qt系统托盘与可执行程序图标
箴言:心有花木,向阳而生。

系统托盘
官方文档描述
现代操作系统通常会在桌面上提供一个特殊区域,称为系统托盘或通知区域,长期运行的应用程序可以在该区域显示图标和简短消息。
例如下面所示。“红色爱心”为系统托盘的显示,右侧冒泡消息可以通过:showMessage()来进行显示。

要检测用户桌面上是否存在系统托盘,请调用 QSystemTrayIcon::isSystemTrayAvailable() 静态函数。
要添加系统托盘项,需创建 QSystemTrayIcon 对象,调用 setContextMenu() 为图标提供上下文菜单,然后调用 show() 使其在系统托盘中可见。随时可使用 showMessage() 显示状态通知消息("气泡消息")。
若在构造系统托盘图标时系统托盘不可用,但后续变得可用,只要图标处于可见状态,QSystemTrayIcon 将自动在系统托盘中添加应用程序项。
当用户激活图标时,会触发 activated() 信号。
系统托盘在桌面应用程序中扮演着至关重要的角色,其主要作用可以归纳为以下几个核心方面:
- 后台持续运行;
- 即使状态显示:例如网络连接断开,连接成功,下载完成等状态的提示。
- 非打扰式通知:通过气泡消息传递信息,在桌面右下角以冒泡形式存在,不强制打断用户当前操作流程。
- 快速功能访问:提供快捷的快捷菜单显示。
使用案例(Qt官方案例)
创建系统托盘和菜单
void SystayDemo::initSystayIcon()
{
m_systemIco = new QSystemTrayIcon(this);
m_systemIco->setIcon(QIcon(":/images/heart.png"));
setWindowIcon(QIcon(":/images/heart.png"));
m_systemIco->setToolTip("Hello, World");
QMenu* trayIconMenu = new QMenu(this);
trayIconMenu->addAction(minimizeAction);
trayIconMenu->addAction(maximizeAction);
trayIconMenu->addAction(restoreAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
m_systemIco->show();
m_systemIco->setContextMenu(trayIconMenu);
// 右下角以冒泡消息框显示, 默认10s后自动消失
m_systemIco->showMessage("title", "msg");
connect(m_systemIco, &QSystemTrayIcon::activated, this, &SystayDemo::iconActivated);
}
绑定菜单动作
void SystayDemo::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
// 对于系统托盘的操作响应方式
switch (reason)
{
case QSystemTrayIcon::Trigger:
case QSystemTrayIcon::DoubleClick:
qApp->postEvent(qApp, new EventHeader("Hello, CustomMsg"));
showNormal();
break;
// 测试逻辑
case QSystemTrayIcon::MiddleClick:
m_systemIco->showMessage(
"下载完成",
"文件 'project.zip' 已下载完成",
QSystemTrayIcon::Information,
3000
);
break;
default:
;
}
}
需要注意的是,关闭主窗口时,需要判断是直接退出程序,还是最小化。
// 判断系统是否支持系统托盘
if (!QSystemTrayIcon::isSystemTrayAvailable())
{
QMessageBox::critical(nullptr, QObject::tr("Systray"),
QObject::tr("I couldn't detect any system tray "
"on this system."));
return 1;
}
// 判断最后一个窗口关闭时,是否终止程序。
// Qt默认,当最后一个window关闭时, 会退出程序。无论是QWidget w, 还是new QWidget
QApplication::setQuitOnLastWindowClosed(false);
// 如果不进行设置,也可以通过下面函数来实现
void closeEvent(QCloseEvent *event) override
{
qDebug() << "用户点击了关闭按钮";
// 隐藏窗口而不是关闭
hide();
// 显示托盘消息提示
if (trayIcon && trayIcon->isVisible())
{
trayIcon->showMessage("应用程序",
"程序已最小化到系统托盘\n右键点击图标显示菜单",
QSystemTrayIcon::Information, 2000);
}
event->ignore(); // 重要:忽略关闭事件,不退出应用
}
设置应用和可执行图标
在window下面的QtCreator下进行配置。
# 设置应用程序图标(Windows),图标和当前pro在同一目录。
RC_ICONS = Hakuon.ico
设置后,将会影响窗口的图标,任务栏图标,生成的可执行图标。
如果设置了系统托盘,系统托盘的图标不会受到上面图标设置的影响。
同样的,如果给窗口设置了下面,将会影响应用程序的图标和任务栏图标。
w->setWindowIcon(QIcon("xx"));
QApplication::setWindowIcon(QIcon("xx"))
但是不会改变可执行程序生成的图标。

浙公网安备 33010602011771号