Qt之程序最小化托盤顯示及操作



展開
1.功能說明
對於GUI程序,如果想要實現當最小化時,程序從任務欄消失,在系統托盤顯示一個圖標,表示此程序,並能在托盤內通過雙擊或者菜單使程序界面恢復。
2.使用的類
主要使用的此類:QSystemTrayIcon。
其中QSystemTrayIcon是主要操作系統托盤的操作類,通過此類,可以在托盤顯示指定程序的圖標,響應用戶鼠標的單擊,雙擊,或wheel操作(好像只對X11系統有用),顯示指定消息,顯示菜單等。
此類中有兩個枚舉類型,分別如下:
enum QSystemTrayIcon::ActivationReason 表述托盤上圖標的觸發緣由
常量 值 描述
QSystemTrayIcon::Unknown 0 未知原因
QSystemTrayIcon::Context 1 請求系統托盤的上下文菜單
QSystemTrayIcon::DoubleClick 2 鼠標雙擊
QSystemTrayIcon::Trigger 3 鼠標單擊
QSystemTrayIcon::MiddleClick 4 鼠標中間按鍵
enum QSystemTrayIcon::MessageIcon 當顯示氣球消息時顯示的圖片
常量 值 描述
QSystemTrayIcon::NoIcon 0 不顯示圖標
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改為“最小化”,如下圖:

b)給工程加入Qt Resource資源文件,添加一個在托盤顯示的icon圖片,如圖:
 
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();
}

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

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(0);
}


然后
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,
                                  1000);
        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 = 0);
    ~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,
                                  1000);
        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(0);
}
————————————————
版權聲明:本文為CSDN博主「祝雲飛」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhuyunfei/article/details/51433822


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM