MinTray 說明 實現程式關閉時最小化托盤的功能 托盤實現顯示主頁面和退出的功能 支持擴展,直接引用TrayIcon類即可,對外暴露介面 單例實現,可復用 警告 註:博主所有資源永久免費,若有幫助,請點贊轉發是對我莫大的幫助 註:博主本人學習過程的分享,引用他人的文章皆會標註原作者 註:本人文章 ...
MinTray
說明
- 實現程式關閉時最小化托盤的功能
- 托盤實現顯示主頁面和退出的功能
- 支持擴展,直接引用TrayIcon類即可,對外暴露介面
- 單例實現,可復用
警告
- 註:博主所有資源永久免費,若有幫助,請點贊轉發是對我莫大的幫助
- 註:博主本人學習過程的分享,引用他人的文章皆會標註原作者
- 註:本人文章非盈利性質,若有侵權請聯繫我刪除
- 註:獲取資源或者咨詢問題請聯繫Q:2950319782
- 註:博主本人很菜,文章基本是二次創作,大佬請忽略我的隨筆
- 註:我會一步步分享實現的細節,若仍有問題聯繫我
GitHub
開發環境
- win10系統
- qtcreator4.11.1
- QT版本:5.14.2
問題解決
需求
- 程式在關閉的時候需要供用戶選擇是直接關閉程式還是最小化在托盤運行
- 在托盤運行,程式主界面要隱藏
- 托盤要提供最基本的顯示回主界面和退出程式的功能
結構
思路
- 這裡主要為了實現關閉程式的時候實現程式托盤運行的demo,隨便創建一個widget程式Tray即可,重寫視窗的CloseEvent事件,處理關閉程式和最小化到托盤運行的功能
- 使用QT自帶的QSystemTrayIcon來實現托盤的功能,單獨創建一個TrayIcon類來封裝,繼承自Object即可,不需要ui文件,
- 由於托盤這個類功能比較單一,而且是需要的 時候才創建,而且不能跟隨調用者的生存周期,這裡使用懶漢單例實現最好,最好使用智能指針,省的發生記憶體泄漏,在Tray視窗需要的時候才創建
- 下麵先來實現TrayIcon的單例,這裡使用返回static TrayIcon* 的Instance函數加獨占智能指針實現
- 這裡我是選擇在CloseEvent事件中創建TrayIcon實例
- 在TrayIcon類中,首先需要維持所屬的主窗體mainWidget和托盤對象trayIcon,同時定義public的設置主窗體函數setMainWidget來設置調用的主窗體
- 在TrayIcon的構造函數中實例化托盤對象trayIcon,設置圖標,完成初始配置
- 到這裡只要設置托盤為可見,托盤就已經可以顯示出來了,但是沒法關閉程式和顯示主頁面了,下麵來實現這兩個功能
- 首先創建菜單QMenu,因為這個菜單功能主要是跟主視窗的交互,那麼在傳入主視窗的setMainWidget函數中設置菜單為好
- 先加上回顯主窗體的功能,定義回顯函數showMainWidget
- 下麵處理關閉程式的功能,這裡最好是設置一個是關閉托盤還是關閉程式的標誌位,判斷一下最好
- 菜單功能處理後,是需要將菜單和滑鼠右鍵綁定,否則不能處理相關操作
- 最後處理一下托盤激活程式,為了簡單,這裡雙擊和單擊都回顯主窗體
關鍵代碼
If you need inspiring words,don't do it
重寫CloseEvent事件
void Tray::closeEvent(QCloseEvent *event) { //彈出一個選擇按鈕,是否最小化程式到托盤運行 QMessageBox::StandardButton button = QMessageBox::question(this,"提示","是否最小化到系統托盤", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); //不關閉程式,最小化程式到托盤運行 if(button == QMessageBox::Yes) { //設置托盤所屬的主窗體 TrayIcon::Instance()->setMainWidget(this); //忽略關閉事件 event->ignore(); //隱藏主視窗 this->hide(); //設置托盤可見 TrayIcon::Instance()->setVisible(true); //設置提示消息,看不見消息的是電腦開啟了勿擾模式 TrayIcon::Instance()->showMessage("自定義最小化托盤", "已最小化"); } //關閉程式 else { event->accept(); } }
實現懶漢單例
//定義懶漢單例 TrayIcon* TrayIcon::Instance() { if(self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if(self.isNull()) { self.reset(new TrayIcon); } } return self.data(); }
回顯主窗體函數
//定義顯示主界面的槽函數 void TrayIcon::showMainWidget() { //有主窗體 if(mainWidget) { //顯示出來主窗體 mainWidget->showNormal(); //重新聚焦主窗體 mainWidget->activateWindow(); } }
關閉程式函數
//定義關閉的槽函數 void TrayIcon::closeAll() { //隱藏,並刪掉,退出程式 trayIcon->hide(); trayIcon->deleteLater(); qApp->exit(); }
設置調用的主窗體,並綁定相關的功能
//定義設置所屬的主窗體 void TrayIcon::setMainWidget(QWidget *mainWidget) { this->mainWidget = mainWidget; //給托盤加上菜單功能 menu->addAction("主界面",this,SLOT(showMainWidget())); //直接退出 if(exitDirect) { menu->addAction("退出",this,SLOT(closeAll())); } else { menu->addAction("退出",this,SIGNAL(trayIconExit())); } //菜單綁定到右鍵 trayIcon->setContextMenu(menu); }