Qt之QSystemTrayIcon


簡述

QSystemTrayIcon類為應用程序在系統托盤中提供一個圖標。

現代操作系統通常在桌面上提供一個特殊的區域,稱為系統托盤或通知區域,長時間運行的應用程序可以顯示圖標和短消息。

內容

詳細描述

要檢查系統托盤是否存在在用戶的桌面上,調用QSystemTrayIcon::isSystemTrayAvailable()靜態函數。

要添加系統托盤項,首先,需要創建一個QSystemTrayIcon對象,並調用setContextMenu()為圖標提供上下文菜單,然后,調用show()使其在系統托盤中可見。狀態通知消息(“氣球消息”)可以在任何時候使用showMessage()來進行顯示。

當用戶激活托盤圖標時,activated()信號會被發射。

只有在X11上時,當發出一個tooltip請求時,QSystemTrayIcon會接收一個QEvent::ToolTip類型的QHelpEvent事件。此外,QSystemTrayIcon會接收QEvent::Wheel類型的滾輪事件。這些都是不支持任何其它平台。

共有類型

  • 枚舉QSystemTrayIcon::ActivationReason:

    此枚舉描述了系統托盤被激活的原因。

常量 描述
QSystemTrayIcon::Unknown 0 未知原因
QSystemTrayIcon::Context 1 系統托盤的上下文菜單請求
QSystemTrayIcon::DoubleClick 2 雙擊系統托盤
QSystemTrayIcon::Trigger 3 單擊系統托盤
QSystemTrayIcon::MiddleClick 4 鼠標中鍵點擊系統托盤

 

  • 枚舉QSystemTrayIcon::MessageIcon:

    此枚舉描述了顯示氣球消息時所顯示的圖標。

常量 描述
QSystemTrayIcon::NoIcon 0 無圖標顯示
QSystemTrayIcon::Information 1 一個信息圖標顯示
QSystemTrayIcon::Warning 2 一個標准的警告圖標顯示
QSystemTrayIcon::Critical 3 一個嚴重的警告圖標顯示

共有函數

  • QMenu * contextMenu() const
    返回系統托盤的當前上下文菜單。

  • void setContextMenu(QMenu * menu)
    設置指定菜單為系統托盤的上下文菜單。

    當用戶通過點擊鼠標請求系統托盤的上下文菜單時,菜單會彈出。

    在OS X中,一般轉換為一個NSMenu,所以aboutToHide()信號不會發出。

    注意:系統托盤菜單並不對菜單有所有權,必須確保在恰當的時候刪除菜單,例如:創造一個具有合適父對象的菜單。

  • QRect QSystemTrayIcon::geometry() const
    返回系統托盤圖標在屏幕上的幾何坐標。

  • QIcon icon() const

  • void setIcon(const QIcon & icon)

    icon : QIcon
    這個屬性保存了系統托盤的圖標。

    在Windows中,系統任務欄圖標的大小是16×16;X11中,首選大小為22x22。必要時該圖標將被調整到合適大小。

  • void setToolTip(const QString & tip)

  • QString toolTip() const

    toolTip : QString
    這個屬性保存了系統托盤的提示信息。

    在一些系統中,tooltip的長度是有限的,在必要時tooltip將被截斷。

  • bool isVisible() const
    返回系統托盤是否可見。

公有槽函數

  • void hide()
    隱藏系統托盤。

  • void setVisible(bool visible)
    設置系統托盤是否可見。

    設置為true或調用show()使系統托盤圖標可見;設置為false或調用hide()隱藏它。

  • void show()
    顯示系統托盤。

  • void showMessage(const QString & title, const QString & message, QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information, int millisecondsTimeoutHint = 10000)
    顯示一個氣球消息,使用所給出的標題、消息、圖標和指定的時間,標題和消息必須是純文本字符串。

消息可以被用戶點擊,當用戶點擊時發出messageClicked()信號 。

信號

  • void activated(QSystemTrayIcon::ActivationReason reason)
    當用戶激活系統托盤圖標,這個信號被發射。reason指定激活的原因, QSystemTrayIcon::ActivationReason列舉了各種原因。

  • void messageClicked()
    當使用showMessage()顯示的消息被用戶點擊時,此信號被發射。

    目前,這個信號不會在OS X中發射。

靜態共有函數

  • bool isSystemTrayAvailable() [static]
    如果系統托盤可用,返回true;否則,返回false。

    如果系統盤是當前不可用,但以后變為可用,若QSystemTrayIcon可見,它就會自動在系統托盤中添加條目。

  • bool supportsMessages() [static]
    如果系統托盤支持氣球消息,則返回true;否則,返回false。

示例

效果

這里寫圖片描述 這里寫圖片描述 這里寫圖片描述

源碼

首先,自定義系統托盤需要使用的上下文菜單TrayMenu,其繼承自QMenu,並通過addAction()為其添加需要的菜單項。

#include <QMenu>

class TrayMenu : public QMenu
{
    Q_OBJECT

public:
    explicit TrayMenu(QWidget *parent = 0);
    ~TrayMenu();

signals:
    // 自定義信號
    void showWindow();

private:
    // 添加菜單項
    void initActions();

private:
    QAction *m_pShowAction;
    QAction *m_pSettingAction;
    QAction *m_pHomePageAction;
    QAction *m_pHelpAction;
    QAction *m_pAboutAction;
    QAction *m_pUpgradeAction;
    QAction *m_pQuitAction;
};
TrayMenu::TrayMenu(QWidget *parent)
    : QMenu(parent)
{

}

TrayMenu::~TrayMenu()
{

}

// 添加菜單項
void TrayMenu::initActions()
{
    // 創建菜單項
    m_pShowAction = new QAction(QIcon(":/icon/open"), QString::fromLocal8Bit("顯示"), this);
    m_pSettingAction = new QAction(QIcon(":/icon/setting"), QString::fromLocal8Bit("設置"), this);
    m_pHomePageAction = new QAction(QIcon(":/icon/home"), QString::fromLocal8Bit("登錄網頁"), this);
    m_pHelpAction= new QAction(QIcon(":/icon/help"), QString::fromLocal8Bit("幫助"), this);
    m_pAboutAction = new QAction(QIcon(":/icon/about"), QString::fromLocal8Bit("關於"), this);
    m_pUpgradeAction = new QAction(QIcon(":/icon/upgrade"), QString::fromLocal8Bit("檢查更新"), this);
    m_pQuitAction = new QAction(QIcon(":/icon/quit"), QString::fromLocal8Bit("退出"), this);

    // 添加菜單項
    addAction(m_pShowAction);
    addAction(m_pSettingAction);
    addAction(m_pHomePageAction);
    addSeparator();
    addAction(m_pHelpAction);
    addAction(m_pAboutAction);
    addAction(m_pUpgradeAction);
    addSeparator();
    addAction(m_pQuitAction);

    // 連接信號-信號(僅列舉連接顯示窗口的信號)
    connect(m_pShowAction, SIGNAL(triggered(bool)), this, SIGNAL(showWindow()));
}

然后,創建系統托盤QSystemTrayIcon,並通過setContextMenu()為其設置自定義的上下文菜單TrayMenu。

MainWindow::MainWindow(QWidget *parent)
    : CustomWindow(parent)
{
    // ...

    QSystemTrayIcon *pSystemTray = new QSystemTrayIcon(this);
    TrayMenu *pTrayMenu = new TrayMenu(this);

    // 設置系統托盤的上下文菜單
    pSystemTray->setContextMenu(pTrayMenu);

    // 設置系統托盤提示信息、托盤圖標
    pSystemTray->setToolTip(QString::fromLocal8Bit("我就是托盤"));
    pSystemTray->setIcon(QIcon(":/icon/login"));

    // 連接信號槽
    connect(pTrayMenu, SIGNAL(showWindow()), this, SLOT(showWindow()));
    connect(pSystemTray , SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(onActivated(QSystemTrayIcon::ActivationReason)));

    // 顯示系統托盤
    pSystemTray->show();

    // 顯示系統托盤提示信息
    pSystemTray->showMessage(QString::fromLocal8Bit("托盤標題"), QString::fromLocal8Bit("托盤顯示內容"));
}

// 顯示窗體
void MainWindow::showWindow()
{
    showNormal();
    raise();
    activateWindow();
}

// 激活系統托盤
void MainWindow::onActivated(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
    // 單擊托盤顯示窗口
    case QSystemTrayIcon::Trigger:
    {
        showNormal();
        raise();
        activateWindow();
        break;
    }
    // 雙擊
    case QSystemTrayIcon::DoubleClick:
    {
        // ...
        break;
    }
    default:
        break;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM