Qt視窗最小化到托盤,托盤選單控制
阿新 • • 發佈:2019-01-11
作為Qt初學者,最近在編寫視窗最小化到托盤功能程式碼的時候遇到了點阻礙。
Qt自帶的demo實現的功能太過繁瑣,涉及知識點又太雜,很難理出最核心的思路。網上的文章程式碼也很多脫骨於這個demo,註釋說明太少。
所以自己對比了Qt的demo和網上的文章,自己寫了個簡單的最小化到系統托盤的功能。
先看一下程式碼的實現功能:
1.空白視窗,關閉叉叉不會關閉視窗,而是最小化到托盤
2.系統托盤,單擊恢復隱藏視窗
3.系統托盤,右擊出現選單,選單有兩個選項:恢復視窗、關閉程式
再看一下原始碼(由於功能簡單,所以很多模組功能就沒有單獨編寫函式,都直接寫在了初始化函式中)
標頭檔案mwin.h
#ifndef MWIN_H #define MWIN_H #include <QWidget> #include <QtGui> class MWin : public QWidget { Q_OBJECT public: explicit MWin(QWidget *parent = 0); void init();//初始化函式 QSystemTrayIcon *tray;//托盤圖示 QMenu *menu;//托盤選單 QAction *reset;//選單實現功能:恢復視窗 QAction *quit;//選單實現功能:退出程式 protected: void closeEvent(QCloseEvent *event);//由於要關閉視窗變為隱藏至托盤圖示,所以要重寫close事件 signals: public slots: void TrayIconAction(QSystemTrayIcon::ActivationReason reason);//對托盤圖示操作的槽:本程式碼實現單機圖示恢復視窗功能 }; #endif // MWIN_H
解釋檔案mwin.cpp
#include "mwin.h" MWin::MWin( QWidget *parent ) : QWidget( parent ) { init(); /* 初始化 */ } void MWin::init() { /****主視窗****/ this->setFixedSize( 200, 200 ); this->setWindowTitle( "托盤APP" ); /****托盤*** */ tray = new QSystemTrayIcon( this ); /* 初始化托盤物件tray */ tray->setIcon( QIcon( QPixmap( ":/image/ico.png" ) ) ); /* 設定托盤圖示,引號內是自定義的png圖片路徑 */ tray->show(); /* 讓托盤圖示顯示在系統托盤上 */ QObject::connect( tray, SIGNAL( activated( QSystemTrayIcon::ActivationReason ) ), this, SLOT( TrayIconAction( QSystemTrayIcon::ActivationReason ) ) ); /* 連線訊號與槽,實現單擊圖示恢復視窗的功能,槽是自定義的槽 */ /****初始化托盤選單及功能****/ menu = new QMenu( this ); /* 初始化選單 */ reset = new QAction( this ); /* 初始化恢復視窗 */ reset->setText( "顯示視窗" ); QObject::connect( reset, SIGNAL( triggered() ), this, SLOT( showNormal() ) ); /* 選單中的顯示視窗,單擊連線顯示視窗 */ quit = new QAction( this ); /* 初始化退出程式 */ quit->setText( "退出程式" ); QObject::connect( quit, SIGNAL( triggered() ), qApp, SLOT( quit() ) ); /* 選單中的退出程式,單擊連線退出</span> */ /* * qApp,是Qt自帶的demo中的知識點,查了一下文件,qApp是Qt中所有app的指標,關閉它就可以關閉當前的程式 * 之所以不用this,close(),是由於軟體要求關閉改為最小化到托盤,所以close()的功能已經不再是關閉視窗的功能,所以要另尋方法 * 將定義好的選單加入托盤的選單模組中 */ tray->setContextMenu( menu ); menu->addAction( reset ); menu->addAction( quit ); } /* ***重置關閉close()*** */ void MWin::closeEvent( QCloseEvent *event ) { hide(); /* 隱藏視窗 */ event->ignore(); /* 忽略關閉事件 */ } /* * 因為實現的是關閉視窗至系統托盤,所以我們先將視窗hide()隱藏,再忽略關閉視窗功能event->ignore()即可。 * ***托盤圖示槽*** */ void MWin::TrayIconAction( QSystemTrayIcon::ActivationReason reason ) /* 引數是Qt的保留字,表示對托盤圖示的操作,該槽函式功能只實現了單擊功能,可以實現其他功能比如雙擊、中擊,具體可查文件或者Qt自帶demo(關鍵字tray) */ { if ( reason == QSystemTrayIcon::Trigger ) this->showNormal(); /* 如果對圖示進行單擊,則顯示正常大小的視窗 */ }
主函式呼叫測試main.cpp
#include <QtGui>
#include "mwin.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
//***三行編碼設定,保證中文字元***
//本機電腦是UTF-8編碼,其他電腦自行除錯修改編碼
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
MWin *win=new MWin();
win->show();
return app.exec();
}
附上作者原文地址:https://blog.csdn.net/shihoongbo/article/details/38532771