使用QT來創建一個系統托盤,事實上是一件很簡單的事。為什么這么說?一是因為QT文檔給出了比較詳細的例子,二是QT的結構比較優雅,設計風格統一。但是在動手之前,我們要從哪里下手?雖然QT文檔給出了一個比較詳細的例子,但由於功能較多,所以看起來比較費勁。我們在這只是抽絲剝繭,只實現系統托盤這一個功能。
首先,使用QT creator創建一個GUI工程,繼承於QDialog還是QMainWindow還是QWidget都無所謂。我們以繼承QMainWindow為例說明。創建完畢之后,creator將自動生成一些文件,工程文件如下:
打開頭文件mainwindow.h。在類聲明中添加一些必要的成員變量,如下圖所示:
其中:closeEvent()是父類中的一個虛函數。我們在這里將它重寫來,以實現程序窗口關閉時的一些動作。然后后聲明了一個QSystemTrayIcon類型的指針,這是實現系統托盤的一個主要類。然后聲明了四個QAction類型的指針,以及一個QMenu類型的指針,它們將合作實現系統托盤的上下文菜單。好了,我們僅僅只是實現系統托盤的功能,所以添加這些成員就已經足夠了。
一般,我們會看到系統托盤處都有一個小圖標代表程序處於后台運行。那么,我們也添加一個小圖標來作為我們程序的系統托盤圖標。這一步很簡單:先在源代碼的文件夾中建立一個子文件夾,比如命名為images.然后在工程中添加一個資源文件。打開這個資源文件,在右邊下部可以看到一個添加的按鈕,點擊添加前綴,如圖:
添加前綴的時候要注意,默認生成的前綴是:/new/prefix1,我們把后面的文字都去掉,只保留'/'。這是為了簡便處理。之后,再次點擊“添加”按鈕,這次選擇“添加文件”。在打開的文件對話框中,我們選擇先前建立的images文件夾中的一個圖標,點擊確定后結果如圖:
添加圖標的過程到此結束。
下面就轉到mainwindow.cpp文件來進行實際代碼的編寫。一般和窗口組件初始化的代碼,我們都放到主窗口的構造函數中,以便窗口在創建時就將必要的組件初始化好。這里我們就在MainWindow類中進行實現。看代碼:
1 QIcon icon(":/images/sysTray.ico"); 2 systemTray = new QSystemTrayIcon(this); 3 systemTray->setIcon(icon); 4 systemTray->setToolTip("Test Radio Buttons"); 5 minimumAct = new QAction("Minimum Window", this); 6 //Note the differences between hide() and showMinimized(). 7 connect(minimumAct, SIGNAL(triggered()), this, SLOT(hide())); 8 maximumAct = new QAction("Maximum Window", this); 9 connect(maximumAct, SIGNAL(triggered()), this, SLOT(showMaximized())); 10 restoreAct = new QAction("Restore Window", this); 11 connect(restoreAct, SIGNAL(triggered()), this, SLOT(showNormal())); 12 quitAct = new QAction("Quit Application", this); 13 connect(quitAct, SIGNAL(triggered()), qApp, SLOT(quit())); 14 pContextMenu = new QMenu(this); 15 pContextMenu->addAction(minimumAct); 16 pContextMenu->addAction(maximumAct); 17 pContextMenu->addAction(restoreAct); 18 pContextMenu->addSeparator(); 19 pContextMenu->addAction(quitAct); 20 systemTray->setContextMenu(pContextMenu); 21 systemTray->show();
我們逐行進行講解:第1行使用圖標的文件路徑生成一個QIcon對象,這是給QSystemTrayIcon的setIcon用的,用來設置系統托盤圖標。第4行設置提示信息。這個提示信息出現在什么時候呢?就是當你的鼠標放在系統托盤圖標上時,它就會出現。一般設置為程序名稱。第5行到第13行設置上下文菜單項。這里總共設置了四項。分別為縮小、放大、還原窗口和推出程序。每一個菜單項在創建后,我們就將其觸發信號連接到指定的槽函數。第14到20行將創建好的菜單項添加到上下文菜單中去,搞定。第21行將這個系統托盤顯示出來。這一句很重要,不能忘記。否則在系統托盤區將看不到圖標。
這時功能基本完成,程序在一啟動時就可以在系統托盤區看到托盤圖標。但是如果在上述構造函數中沒有加showMessage()這個函數,將不會出現托盤氣球提醒。我們就模仿程序后台運行時的提醒效果吧。那么,我們只需重寫closeEvent()事件即可。如下編寫代碼:
if(systemTray->isVisible()) { hide(); systemTray->showMessage("Tips", "The program is running behind!"); event->ignore(); }
if語句首先對托盤可見性進行判斷。由於我們在構造函數中已經調用了show()函數,所以此時系統托盤圖標是可見的。於是進入if語句。首先將主窗口進行隱藏,然后調用QSystemTrayIcon的showMessage()函數顯式托盤氣球提醒。最后調用ignore()函數忽略事件,以防止該事件繼續傳遞。效果如下圖:
功能完成,再看看上下文菜單的樣子:
至此,簡單的系統托盤功能完成。