Qt實現系統托盤訊息

王廷胡_白嫖帝發表於2024-11-25

實現思路

  1. 建立主應用程式:使用 QApplication 作為應用程式的基礎。
  2. 建立系統托盤圖示:使用 QSystemTrayIcon 來顯示圖示在系統托盤中。
  3. 新增右鍵選單:為托盤圖示新增右鍵選單,允許使用者選擇退出應用程式。
  4. 顯示新訊息:使用 QTimer 定期觸發顯示訊息,模擬新訊息到達的情況。
  5. 處理槽函式:定義槽函式來響應特定事件,例如定時器超時時顯示托盤訊息。

1.包含必要的標頭檔案

#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QWidget>
#include <QTimer>
#include <QIcon>
#include <QMessageBox>
#include <QDebug>

2.定義托盤應用程式類

  • 建立一個名為 TrayApp 的類,繼承自 QWidget
  • 在建構函式中,初始化系統托盤圖示、選單和定時器。
class TrayApp : public QWidget {
public:
    TrayApp() {
        trayIcon = new QSystemTrayIcon(QIcon(":/Image/QQ圖示.png"), this);
        // 建立選單
        QMenu *menu = new QMenu();
        QAction *exitAction = menu->addAction("Exit");
        connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
        trayIcon->setContextMenu(menu);
        trayIcon->show();

3.設定定時器

  • 使用 QTimer 來定時觸發訊息顯示。
  • 連線定時器的超時訊號到槽函式。
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &TrayApp::simulateNewMessage);
        timer->start(3000); // 每3秒傳送一次訊息
    }

4.定義槽函式

  • 在私有槽中定義 simulateNewMessage 函式,該函式用於顯示系統托盤訊息。
private slots:
    void simulateNewMessage() {
        trayIcon->showMessage("新訊息", "您有一條新訊息!", QSystemTrayIcon::Information);
    }

5.main 函式中建立應用程式例項

  • 建立 QApplication 物件並設定退出行為。
  • 建立 TrayApp 的例項,啟動事件迴圈。
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    app.setQuitOnLastWindowClosed(false);

    TrayApp trayApp; // 建立托盤應用例項
    return app.exec();
}

完整程式碼

#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QWidget>
#include <QTimer>
#include <QIcon>
#include <QMessageBox>
#include <QDebug>

class TrayApp : public QWidget {
public:
    TrayApp() {
        trayIcon = new QSystemTrayIcon(QIcon(":/Image/QQ圖示.png"), this);

        // 建立選單
        QMenu *menu = new QMenu();
        QAction *exitAction = menu->addAction("Exit");
        connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);
        trayIcon->setContextMenu(menu);

        // 顯示托盤圖示
        trayIcon->show();

        // 定時器,模擬新訊息
        QTimer *timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &TrayApp::simulateNewMessage);
        timer->start(3000); // 每3秒傳送一次訊息
    }

private slots:
    void simulateNewMessage() {
        trayIcon->showMessage("新訊息", "您有一條新訊息!", QSystemTrayIcon::Information);
    }

private:
    QSystemTrayIcon *trayIcon; // 使用指標型別以動態建立
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    app.setQuitOnLastWindowClosed(false);

    TrayApp trayApp; // 建立托盤應用例項
    return app.exec();
}

總結

  • 這個程式碼實現了一個簡單的系統托盤應用,能在托盤中顯示圖示,並定期顯示訊息。
  • 使用者可以透過右鍵選單退出應用程式。
  • 透過使用 Qt 的訊號和槽機制,程式碼結構清晰、易於維護與擴充套件。

相關文章