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事件即可,判斷是最小化程式到托盤執行還是關閉程式
關鍵程式碼
重寫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(); }