從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...
ScreenCap---Version:003
說明
上一篇:實現預設位置設置
- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾
- 實現最小化程式到托盤運行
- 實現托盤菜單功能
- 實現回顯主窗體
- 實現托盤開始截屏
- 實現氣泡信息提示
- 實現托盤程式提示
- 實現托盤退出程式
- 封裝完好,可復用
警告
- 註:博主所有資源永久免費,若有幫助,請點贊轉發是對我莫大的幫助
- 註:博主本人學習過程的分享,引用他人的文章皆會標註原作者
- 註:本人文章非盈利性質,若有侵權請聯繫我刪除
- 註:獲取資源或者咨詢問題請聯繫Q:2950319782
- 註:博主本人很菜,文章基本是二次創作,大佬請忽略我的隨筆
- 註:我會一步步分享實現的細節,若仍有問題聯繫我
GitHub
- 倉庫master下的ScreenCap項目
- 若您無法正常訪問,每次項目的資源會隨文章一同發佈,下載壓縮包即可,永久免費
- 壓縮包可能較GitHub更新不及時,請諒解
開發環境
- win10系統
- 編譯器qtcreator4.11.1
- QT版本:5.14.2
- C++11
問題解決
需求
- 實現關閉程式時供用戶選擇,是最小化程式到托盤還是直接關閉
- 最小化程式到托盤,彈出氣泡信息,提示程式已經最小化到托盤運行了
- 在托盤運行的時候應該提供菜單功能
- 實現回顯主窗體
- 實現開始截屏功能
- 實現退出程式的功能
結構
思路
- 要實現托盤運行,首先要有一個托盤類,新建一個繼承自QObject的TrayIcon類即可,在這個類中我們實現自己的托盤程式
- 由於這個類只實現了托盤功能,功能單一,為了方便以後對他的擴展,這裡仍然使用單例模式實現
- 先把托盤程式的ico文件作為資源文件引入到程式里
- 先實現單例吧
- 單例實現完後,這個類已經被創建出來了,這裡我們使用QT自帶的QSystemTrayIcon實現托盤,在這個類中,維持該類的對象trayIcon,為什麼有這個類了,我們還要自己實現TaryIcon呢,因為要封裝,不能所有的代碼都寫在主窗體中,太難維護了,如果不懂,可以補一補設計模式的知識
- 還需要維持其所屬的主窗體和含有的菜單選項
- 這個類自己不需要創建,供其他的類使用,這裡我們對外暴漏出設置所屬的主窗體介面setMainWidget,誰調用誰就是主窗體,方便回顯主窗體
- 接著暴露設置托盤可見屬性的getVisible和setVisible介面
- 還有滑鼠放到托盤上的提示信息介面setToolTip,要不誰知道你的托盤是乾什麼的
- 最後是系統提示消息showMessage,上面的都有誰調用誰設置
- 先來處理預設構造函數,初始化主窗體,沒人調用就是0,設置固定不變的圖標
- 在setMainWidget中,這裡與調用的窗體進行關聯,同時設置菜單,添加上回顯主界面,開始截屏,退出程式的功能
- 這個TrayIcon基本定義完了,下麵是需要跟screencapwidget關聯上,我們是需要點擊關閉事件的時候處理,那麼重寫closeEvent事件即可,判斷是最小化程式到托盤運行還是關閉程式
關鍵代碼
If you need inspiring words,don't do it
重寫CloseEvent事件
void ScreenCapWidget::closeEvent(QCloseEvent *event) { //彈出一個選擇按鈕,是否最小化程式到托盤運行 QMessageBox::StandardButton button = QMessageBox::question(this, "提示", "是否最小化到系統托盤", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes); //不關閉程式,最小化程式到托盤運行 if(button == QMessageBox::Yes) { //設置托盤所屬的主窗體 TrayIcon::getInstance()->setMainWidget(this); //忽略關閉事件 event->ignore(); //隱藏主視窗 this->hide(); //設置托盤可見 TrayIcon::getInstance()->setVisible(true); TrayIcon::getInstance()->setToolTip("ScreenCap"); TrayIcon::getInstance()->showMessage("ScrennCap托盤運行", "已最小化"); } //關閉程式 else { event->accept(); } }
回顯主界面
//回顯主界面 void TrayIcon::showMainWidget() { if(mainWidget) { mainWidget->showNormal(); mainWidget->activateWindow(); } }
開始截屏
//托盤開始截屏 void TrayIcon::StartCap() { ScreenWidget::Instance()->showFullScreen(); }
退出程式
//退出菜單功能 void TrayIcon::closeAll() { //隱藏,刪掉,退出 trayIcon->hide(); trayIcon->deleteLater(); qApp->exit(); }
單例實現
QScopedPointer<TrayIcon> TrayIcon::self; //定義單例 TrayIcon* TrayIcon::getInstance() { if(self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if(self.isNull()) { self.reset(new TrayIcon); } } return self.data(); }
TrayIcon.h
#ifndef TRAYICON_H #define TRAYICON_H #include <QObject> #include<QSystemTrayIcon> class QMenu; class TrayIcon : public QObject { Q_OBJECT public: explicit TrayIcon(QObject *parent = nullptr); static TrayIcon* getInstance(); private: static QScopedPointer<TrayIcon> self; //維持所屬的主窗體 QWidget* mainWidget; //維持托盤對象 QSystemTrayIcon* trayIcon; //維持托盤菜單 QMenu* menu; public: //所屬的主窗體 void setMainWidget(QWidget* mainWidget); //獲取可見和不可見 bool getVisible() const; void setVisible(bool visible); //設置滑鼠放上去的提示信息 void setToolTip(const QString& tip); //設置最小化托盤後的系統提示信息 void showMessage(const QString& title, const QString& msg, QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information, int msec = 5000); public Q_SLOTS: //退出 void closeAll(); //回顯主窗體 void showMainWidget(); //開始截屏 void StartCap(); private slots: signals: }; #endif // TRAYICON_H
TrayIcon.cpp
#include "trayicon.h" #include"qmutex.h" #include"qapplication.h" #include"qmenu.h" #include"screenwidget.h" QScopedPointer<TrayIcon> TrayIcon::self; //定義單例 TrayIcon* TrayIcon::getInstance() { if(self.isNull()) { static QMutex mutex; QMutexLocker locker(&mutex); if(self.isNull()) { self.reset(new TrayIcon); } } return self.data(); } TrayIcon::TrayIcon(QObject *parent) : QObject(parent) { mainWidget = 0; //實例化托盤對象 trayIcon = new QSystemTrayIcon(this); //設置托盤圖標 trayIcon->setIcon(QIcon(":/mintray.ico")); //實例化托盤菜單 menu = new QMenu; } //定義設置所屬的主窗體 void TrayIcon::setMainWidget(QWidget *mainWidget) { this->mainWidget = mainWidget; menu->addAction("主界面",this,SLOT(showMainWidget())); menu->addAction("開始截屏",this,SLOT(StartCap())); menu->addAction("退出",this,SLOT(closeAll())); trayIcon->setContextMenu(menu); } //設置提示信息 void TrayIcon::setToolTip(const QString &tip) { trayIcon->setToolTip(tip); } //設置氣泡信息 void TrayIcon::showMessage(const QString &title, const QString &msg, QSystemTrayIcon::MessageIcon icon, int msec) { trayIcon->showMessage(title,msg,icon,msec); } //實現顯示托盤 bool TrayIcon::getVisible() const { return trayIcon->isVisible(); } void TrayIcon::setVisible(bool visible) { trayIcon->setVisible(visible); } //實現槽函數 //退出菜單功能 void TrayIcon::closeAll() { //隱藏,刪掉,退出 trayIcon->hide(); trayIcon->deleteLater(); qApp->exit(); } //回顯主界面 void TrayIcon::showMainWidget() { if(mainWidget) { mainWidget->showNormal(); mainWidget->activateWindow(); } } //托盤開始截屏 void TrayIcon::StartCap() { ScreenWidget::Instance()->showFullScreen(); }