作為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()
//***主視窗***</span>
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的指針,關閉它就可以關閉目前的程式</span>
//之是以不用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();
}