当前位置: 首页 > news >正文

Qt系统托盘与可执行程序图标

Qt系统托盘与可执行程序图标

目录
  • Qt系统托盘与可执行程序图标
    • 系统托盘
      • 官方文档描述
      • 使用案例(Qt官方案例)
    • 设置应用和可执行图标


箴言:心有花木,向阳而生。

系统托盘

官方文档描述

现代操作系统通常会在桌面上提供一个特殊区域,称为系统托盘或通知区域,长期运行的应用程序可以在该区域显示图标和简短消息。

例如下面所示。“红色爱心”为系统托盘的显示,右侧冒泡消息可以通过:showMessage()来进行显示。

image-20251129185421388

要检测用户桌面上是否存在系统托盘,请调用 QSystemTrayIcon::isSystemTrayAvailable() 静态函数。

要添加系统托盘项,需创建 QSystemTrayIcon 对象,调用 setContextMenu() 为图标提供上下文菜单,然后调用 show() 使其在系统托盘中可见。随时可使用 showMessage() 显示状态通知消息("气泡消息")。

若在构造系统托盘图标时系统托盘不可用,但后续变得可用,只要图标处于可见状态,QSystemTrayIcon 将自动在系统托盘中添加应用程序项。

当用户激活图标时,会触发 activated() 信号。

系统托盘在桌面应用程序中扮演着至关重要的角色,其主要作用可以归纳为以下几个核心方面:

  1. 后台持续运行;
  2. 即使状态显示:例如网络连接断开,连接成功,下载完成等状态的提示。
  3. 非打扰式通知:通过气泡消息传递信息,在桌面右下角以冒泡形式存在,不强制打断用户当前操作流程。
  4. 快速功能访问:提供快捷的快捷菜单显示。

使用案例(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"))

但是不会改变可执行程序生成的图标。

屏幕截图 2025-11-29 201124

http://www.jsqmd.com/news/55397/

相关文章:

  • 深入解析:IHR 2025 | 移远通信携Robrain AI解决方案亮相,开启机器人全感官交互新纪元
  • 2025-11-29
  • 2025 哈尔滨轴承企业品牌知名度调研排名
  • 接口测试:JMeter(三)
  • 散列表
  • 腾讯TBDS和Cloudera Data AI CMP 比较的缺陷在哪里?
  • python获取绝对路径复制文件
  • Task状态
  • OI退役记
  • 实用指南:算法<C++>——二分查找
  • 2025 哈尔滨轴承品牌价值TOP10榜单
  • AI革命中的开源NLP工具与技术实践
  • Python 潮流周刊#129:Pydantic 还能做些什么?
  • 【论术】: 响应式布局——flex:1与calc的区别
  • Git 误操作恢复指南:回退`reset --hard` 和 `push -f`
  • 详细介绍:算法 - 差分
  • 《程序员修炼之道:从小工到专家》观后感第六篇
  • Day6-20251129
  • 详细介绍:反反爬虫实战:手撕某知名网站Webpack加密的JavaScript
  • 《程序员修炼之道:从小工到专家》观后感第五篇
  • 深入解析:Rust 迭代器的性能优化技巧
  • 20251129——读后感6
  • #20232408 2025-2026-1 《网络与系统攻防技术》实验七实验报告 - 20232408
  • 百科代做公司推荐,2025年12月权威发布百度百科/快懂百科代做公司信息
  • 价值七原语:文明觉醒的阶梯
  • 华工激光(HGLASER)闪耀慕尼黑电子展,展示电子制造全产业链解决方案
  • 《程序员修炼之道:从小工到专家》笔记6
  • 2025 年丽水摄影培训人像摄影培训哪家好——路人贾摄影讲堂(丽水分公司)排名第一
  • 2025 年舟山摄影培训人像摄影培训推荐榜:路人贾摄影讲堂(舟山分公司)排名第一、人像摄影十杰创办
  • 2025 年衢州摄影培训人像摄影培训哪家好——路人贾摄影讲堂(衢州分公司)排名第一