天天看點

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()

    //***主視窗***</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();
}
           

繼續閱讀