簡述
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;
}
}
