QSystemTrayIcon 提供跨平台系統托盤圖標支援(Windows 任務欄通知區、Linux 系統托盤、macOS 選單列)。核心功能:圖標顯示、右鍵選單、氣泡訊息、激活信號(點擊/雙擊/中鍵)。
#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
#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()
}
#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();
}
| 值 | 觸發動作 | 典型用途 |
|---|---|---|
Unknown | 未知 | 忽略 |
Context | 右鍵/長按 | 顯示選單(內建自動處理) |
DoubleClick | 雙擊 | 還原視窗/啟動主功能 |
Trigger | 單擊 | 切換視窗顯示/隱藏 |
MiddleClick | 中鍵 | 快速記事/靜音切換等 |