天天看點

Qt之程式最小化托盤顯示及操作1.功能說明2.使用的類3.QSystemTrayIcon常用函數4.代碼

1.功能說明

對于GUI程式,如果想要實作當最小化時,程式從工作列消失,在系統托盤顯示一個圖示,表示此程式,并能在托盤内通過輕按兩下或者菜單使程式界面恢複。

2.使用的類

主要使用的此類:QSystemTrayIcon。

其中QSystemTrayIcon是主要作業系統托盤的操作類,通過此類,可以在托盤顯示指定程式的圖示,響應使用者滑鼠的單擊,輕按兩下,或wheel操作(好像隻對X11系統有用),顯示指定消息,顯示菜單等。

此類中有兩個枚舉類型,分别如下:

enum QSystemTrayIcon::ActivationReason 表述托盤上圖示的觸發緣由

常量 描述
QSystemTrayIcon::Unknown 未知原因
QSystemTrayIcon::Context 1 請求系統托盤的上下文菜單
QSystemTrayIcon::DoubleClick 2 滑鼠輕按兩下
QSystemTrayIcon::Trigger 3 滑鼠單擊
QSystemTrayIcon::MiddleClick 4 滑鼠中間按鍵

enum QSystemTrayIcon::MessageIcon 當顯示氣球消息時顯示的圖檔

常量 描述
QSystemTrayIcon::NoIcon 不顯示圖示
QSystemTrayIcon::Information 1 顯示資訊圖示
QSystemTrayIcon::Warning 2 顯示告警圖示
QSystemTrayIcon::Critical 3 顯示緻命圖示

3.QSystemTrayIcon常用函數

void setIcon(const QIcon& icon)

設定系統托盤的圖示

void setToolTip(const QString &tip)

設定滑鼠放到圖示上的提示文字

void setContextMenu(QMenu* menu);

設定當點選圖示彈出的菜單

void show()

顯示系統托盤圖示

4.代碼

1.實作程式托盤顯示

a)建立一個QWidget程式,在界面上放入一個QPushButton,text改為“最小化”,如下圖:

Qt之程式最小化托盤顯示及操作1.功能說明2.使用的類3.QSystemTrayIcon常用函數4.代碼

b)給工程加入Qt Resource資源檔案,添加一個在托盤顯示的icon圖檔,如圖:

Qt之程式最小化托盤顯示及操作1.功能說明2.使用的類3.QSystemTrayIcon常用函數4.代碼

c)給a中的QPushButton,建立槽函數,在槽函數内實作程式最小化托盤顯示

void MainWindow::on_pushButton_clicked()
{
    //隐藏程式主視窗
    this->hide();

    //建立QSystemTrayIcon對象
    mSysTrayIcon = new QSystemTrayIcon(this);
    //建立托盤要顯示的icon
    QIcon icon = QIcon("../IMClient/Resources/GG64.png");
    //将icon設到QSystemTrayIcon對象中
    mSysTrayIcon->setIcon(icon);
    //當滑鼠移動到托盤上的圖示時,會顯示此處設定的内容
    mSysTrayIcon->setToolTip(QObject::trUtf8("測試系統托盤圖示"));
    //在系統托盤顯示此對象
    mSysTrayIcon->show();
}
           

運作程式,點選按鈕最小化,可以在系統托盤看到此圖示,滑鼠移到上面,可以見看見代碼中所設的”測試系統托盤圖示”文本,如圖:

Qt之程式最小化托盤顯示及操作1.功能說明2.使用的類3.QSystemTrayIcon常用函數4.代碼

2.實作托盤圖示操作

最小化後顯示在系統托盤内,此時除了在任務管理器中結束此程式,無法再做其他操作,而我們還想實作輕按兩下圖示顯示主界面,單擊圖示彈出菜單等實作其他操作,此時,就需要使用QSystemTrayIcon::ActivationReason屬性了。

a)給QSystemTrayIcon對象添加信号為activated(QSystemTrayIcon::ActivationReason)的槽函數

b)在槽函數内,對輕按兩下事件,顯示主視窗界面

代碼如下:

void MainWindow::on_pushButton_clicked()
{
    //隐藏主視窗
    this->hide();

    ......
    //當滑鼠移動到托盤上的圖示時,會顯示此處設定的内容
    mSysTrayIcon->setToolTip(QObject::trUtf8("測試系統托盤圖示"));
    //給QSystemTrayIcon添加槽函數
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
    //在系統托盤顯示此對象
    mSysTrayIcon->show();
}
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        //單擊托盤圖示
        break;
    case QSystemTrayIcon::DoubleClick:
        //輕按兩下托盤圖示
        //輕按兩下後顯示主程式視窗
        this->show();
        break;
    default:
        break;
    }
}
           

程式最小化後,輕按兩下托盤圖示,程式的主界面可以顯示了。

最後再來考慮在單擊系統托盤圖示時,顯示菜單功能。根據上面描述,思路很明确了,如下:

a)建立一個QMenu menu

b)将menu通過QSystemTrayIcon的setContextMenu函數設定到QSystemTrayIcon對象中

再來看代碼實作:

在頭檔案中新增:

QMenu *mMenu;
    QAction *mShowMainAction;
    QAction *mExitAppAction;
    ...
    public:
    void createActions();
    void createMenu();
    ...
    private slots:
    ...
    void on_showMainAction();
    void on_exitAppAction();
           

在cpp中實作:

void MainWindow::createActions()
{
    mShowMainAction = new QAction(QObject::trUtf8("顯示主界面"),this);
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
    connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));

}

void MainWindow::createMenu()
{
    mMenu = new QMenu(this);
    //新增菜單項---顯示主界面
    mMenu->addAction(mShowMainAction);
    //增加分隔符
    mMenu->addSeparator();
    //新增菜單項---退出程式
    mMenu->addAction(mExitAppAction);
    //把QMenu賦給QSystemTrayIcon對象
    mSysTrayIcon->setContextMenu(mMenu);
}
/*
* 當在系統托盤點選菜單内的顯示主界面操作
*/
void MainWindow::on_showMainAction()
{
    this->show();
}

/*
* 當在系統托盤點選菜單内的退出程式操作
*/
void MainWindow::on_exitAppAction()
{
    exit();
}
           

然後

void MainWindow::on_pushButton_clicked()
{
    ......
    //給QSystemTrayIcon添加槽函數
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));

    //建立托盤操作的菜單
    createActions();
    createMenu();
    //在系統托盤顯示此對象
    mSysTrayIcon->show();
}
           

最後再看看消息球的使用

void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        //顯示消息球,1s後自動消失
        //第一個參數是标題
        //第二個參數是消息内容
        //第三個參數圖示
        //第四個參數是逾時毫秒數
        mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                  QObject::trUtf8("歡迎使用此程式"),
                                  QSystemTrayIcon::Information,
                                  );
        break;
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;
    }
}
           

關于系統托盤操作的筆記就記錄到此了,最後是完整代碼的實作。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = );
    ~MainWindow();

public:
    QSystemTrayIcon *mSysTrayIcon;
    QMenu *mMenu;
    QAction *mShowMainAction;
    QAction *mExitAppAction;

public:
    void createActions();
    void createMenu();

private slots:
    void on_pushButton_clicked();
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
    void on_showMainAction();
    void on_exitAppAction();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
           
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QIcon>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    //隐藏主視窗
    this->hide();

    //建立QSystemTrayIcon對象
    mSysTrayIcon = new QSystemTrayIcon(this);
    //建立托盤要顯示的icon
    QIcon icon = QIcon("../IMClient/Resources/GG64.png");
    //将icon設到QSystemTrayIcon對象中
    mSysTrayIcon->setIcon(icon);
    //當滑鼠移動到托盤上的圖示時,會顯示此處設定的内容
    mSysTrayIcon->setToolTip(QObject::trUtf8("測試系統托盤圖示"));
    //給QSystemTrayIcon添加槽函數
    connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));

    //建立托盤操作的菜單
    createActions();
    createMenu();
    //在系統托盤顯示此對象
    mSysTrayIcon->show();
}

void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason){
    case QSystemTrayIcon::Trigger:
        mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                  QObject::trUtf8("歡迎使用此程式"),
                                  QSystemTrayIcon::Information,
                                  );
        break;
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;
    }
}

void MainWindow::createActions()
{
    mShowMainAction = new QAction(QObject::trUtf8("顯示主界面"),this);
    connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));

    mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
    connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));

}

void MainWindow::createMenu()
{
    mMenu = new QMenu(this);
    mMenu->addAction(mShowMainAction);

    mMenu->addSeparator();

    mMenu->addAction(mExitAppAction);

    mSysTrayIcon->setContextMenu(mMenu);
}

void MainWindow::on_showMainAction()
{
    this->show();
}

void MainWindow::on_exitAppAction()
{
    exit();
}
           

繼續閱讀