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

posted @ 2025-11-29 20:24  Hakuon  阅读(0)  评论(0)    收藏  举报