qt 最小化到托盘linux,Qt窗口最小化到托盘,托盘菜单控制
作為Qt初學者,最近在編寫窗口最小化到托盤功能代碼的時候遇到了點阻礙。
Qt自帶的demo實現的功能太過繁瑣,涉及知識點又太雜,很難理出最核心的思路。網上的文章代碼也很多脫骨于這個demo,注釋說明太少。
所以自己對比了Qt的demo和網上的文章,自己寫了個簡單的最小化到系統托盤的功能。
先看一下代碼的實現功能:
1.空白窗口,關閉叉叉不會關閉窗口,而是最小化到托盤
2.系統托盤,單擊恢復隱藏窗口
3.系統托盤,右擊出現菜單,菜單有兩個選項:恢復窗口、關閉程序
再看一下源代碼(由于功能簡單,所以很多模塊功能就沒有單獨編寫函數,都直接寫在了初始化函數中)
頭文件mwin.h
#ifndef MWIN_H
#define MWIN_H
#include
#include
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() ) ); /* 菜單中的退出程序,單擊連接退出 */
/*
* 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
#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();
}
總結
以上是生活随笔為你收集整理的qt 最小化到托盘linux,Qt窗口最小化到托盘,托盘菜单控制的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: linux内存管理分析 二,linux内
- 下一篇: arm linux读cpu id,基于A
