首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Qt 系統托盤圖標完整實現:圖標顯示、右鍵選單、氣泡提示、點擊還原與關閉攔截

     編輯:關於C語言

核心類別:QSystemTrayIcon

QSystemTrayIcon 提供跨平台系統托盤圖標支援(Windows 任務欄通知區、Linux 系統托盤、macOS 選單列)。核心功能:圖標顯示、右鍵選單、氣泡訊息、激活信號(點擊/雙擊/中鍵)。

完整實現步驟與代碼

1. 頭文件宣告 (mainwindow.h)


#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QCloseEvent>

namespace Ui { class MainWindow; }

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    explicit MainWindow(QWidget* parent = nullptr);
    ~MainWindow();
protected:
    void closeEvent(QCloseEvent* event) override; // 攔截關閉事件
private slots:
    void on_action_quit_triggered();              // 選單「退出」動作
    void onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason); // 托盤點擊
private:
    Ui::MainWindow* ui;
    QSystemTrayIcon* trayIcon;        // 托盤圖標
    QMenu* trayIconMenu;              // 右鍵選單
};
#endif

2. 來源文件實現 (mainwindow.cpp)


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);

    // 1. 建立托盤圖標
    trayIcon = new QSystemTrayIcon(this);
    QIcon icon(":/images/tray_icon.png"); // 從資源系統載入
    trayIcon->setIcon(icon);
    trayIcon->setToolTip(tr("托盤測試程式"));

    // 2. 建立右鍵選單
    trayIconMenu = new QMenu(this);
    trayIconMenu->addAction(ui->action_quit); // 假設 UI 已定義 action_quit
    trayIconMenu->addSeparator();
    trayIcon->setContextMenu(trayIconMenu);

    // 3. 顯示圖標與氣泡提示
    trayIcon->show();
    trayIcon->showMessage(tr("啟動"), tr("程式已最小化至托盤"),
                          QSystemTrayIcon::Information, 5000);

    // 4. 連接激活信號(點擊/雙擊/中鍵)
    connect(trayIcon, &QSystemTrayIcon::activated,
            this, &MainWindow::onSystemTrayIconClicked);
}

MainWindow::~MainWindow() { delete ui; }

// 槽函數:處理托盤圖標點擊
void MainWindow::onSystemTrayIconClicked(QSystemTrayIcon::ActivationReason reason) {
    switch (reason) {
    case QSystemTrayIcon::Trigger:     // 單擊
    case QSystemTrayIcon::DoubleClick: // 雙擊
        // 還原視窗:激活並顯示
        setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
        show();
        raise(); // 置頂
        break;
    case QSystemTrayIcon::MiddleClick: // 中鍵(可選:快速操作)
        break;
    default:
        break;
    }
}

// 重寫 closeEvent:點擊「×」最小化到托盤而非退出
void MainWindow::closeEvent(QCloseEvent* event) {
    if (trayIcon->isVisible()) {
        hide();              // 隱藏視窗
        event->ignore();     // 忽略關閉事件,阻止程式退出
    } else {
        event->accept();     // 托盤圖標不存在時正常關閉
    }
}

// 槽函數:選單「退出」真正退出程式
void MainWindow::on_action_quit_triggered() {
    trayIcon->hide();        // 隱藏托盤圖標
    qApp->quit();            // 或 close() → 觸發 closeEvent → accept()
}

3. 主程式入口 (main.cpp)


#include <QApplication>
#include <QTextCodec>
#include "mainwindow.h"

int main(int argc, char* argv[]) {
    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    MainWindow w;
    w.show();
    return a.exec();
}

關鍵技術點深度解析

1. ActivationReason 列舉值

2. 視窗狀態還原的正確姿勢


setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
show();
raise(); // 關鍵:確保視窗置頂獲得焦點

單純 show() 若視窗已最小化可能不會自動還原,需明確清除 WindowMinimized 標誌並設定 WindowActive。

3. 關閉事件攔截邏輯

  • 使用者點擊標題列「×」 → 發送 QCloseEvent
  • closeEvent() 中 hide() + ignore() → 視窗隱藏,程式繼續運行於托盤
  • 選單「退出」 → trayIcon->hide() + qApp->quit() → 徹底退出

4. 資源系統圖標載入

  • .qrc 註冊圖片:<file>images/tray_icon.png</file>
  • 代碼中用 ":/images/tray_icon.png" 存取(編譯進執行檔,部署無遺漏)

5. 跨平台注意事項

  • Linux 需支援 _NET_SYSTEM_TRAY_S 協議的桌面環境(GNOME/KDE/Unity 等)
  • macOS 托盤圖標實為選單列右側項目,行為略有差異
  • Windows 10+ 通知區域預設隱藏圖標,用戶需手動固定

常見錯誤與避坑

  1. 忘記 trayIcon->show():建立後必須顯式顯示
  2. 選單動作未連接:addAction 返回 QAction* 需連接 triggered 信號
  3. closeEvent 中未 ignore():導致程式意外退出
  4. 圖標路徑錯誤:絕對路徑部署失效,必須用資源系統 :/path
  5. 重複建立托盤圖標:單例模式或成員變量持有,勿在事件中重複 new
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
值觸發動作典型用途
Unknown未知忽略
Context右鍵/長按顯示選單(內建自動處理)
DoubleClick雙擊還原視窗/啟動主功能
Trigger單擊切換視窗顯示/隱藏
MiddleClick中鍵快速記事/靜音切換等