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改為“最小化”,如下圖:
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();
}
然後
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();
}