1. 程式人生 > >Qt視窗最小化到托盤,托盤選單控制

Qt視窗最小化到托盤,托盤選單控制

 

作為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