展開
1.功能說明
對於GUI程序,如果想要實現當最小化時,程序從任務欄消失,在系統托盤顯示一個圖標,表示此程序,並能在托盤內通過雙擊或者菜單使程序界面恢復。
2.使用的類
主要使用的此類:QSystemTrayIcon。
其中QSystemTrayIcon是主要操作系統托盤的操作類,通過此類,可以在托盤顯示指定程序的圖標,響應用戶鼠標的單擊,雙擊,或wheel操作(好像只對X11系統有用),顯示指定消息,顯示菜單等。
此類中有兩個枚舉類型,分別如下:
enum QSystemTrayIcon::ActivationReason 表述托盤上圖標的觸發緣由
主要使用的此類: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::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()
顯示系統托盤圖標
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改為“最小化”,如下圖:
1.實現程序托盤顯示
a)新建一個QWidget程序,在界面上放入一個QPushButton,text改為“最小化”,如下圖:
b)給工程加入Qt Resource資源文件,添加一個在托盤顯示的icon圖片,如圖:
c)給a中的QPushButton,建立槽函數,在槽函數內實現程序最小化托盤顯示
void MainWindow::on_pushButton_clicked()
{
//隱藏程序主窗口
this->hide();
{
//隱藏程序主窗口
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();
}
運行程序,點擊按鈕最小化,可以在系統托盤看到此圖標,鼠標移到上面,可以見看見代碼中所設的”測試系統托盤圖標”文本,如圖:
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();
{
//隱藏主窗口
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;
}
}
程序最小化后,雙擊托盤圖標,程序的主界面可以顯示了。
//當鼠標移動到托盤上的圖標時,會顯示此處設置的內容
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對象中
再來看代碼實現:
在頭文件中新增:
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中實現:
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()));
{
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()));
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();
}
{
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_exitAppAction()
{
exit(0);
}
然后
void MainWindow::on_pushButton_clicked()
{
......
//給QSystemTrayIcon添加槽函數
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
{
......
//給QSystemTrayIcon添加槽函數
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
//建立托盤操作的菜單
createActions();
createMenu();
//在系統托盤顯示此對象
mSysTrayIcon->show();
}
最后再看看消息球的使用
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;
}
}
關於系統托盤操作的筆記就記錄到此了,最后是完整代碼的實現。
{
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
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
namespace Ui {
class MainWindow;
}
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public:
QSystemTrayIcon *mSysTrayIcon;
QMenu *mMenu;
QAction *mShowMainAction;
QAction *mExitAppAction;
QSystemTrayIcon *mSysTrayIcon;
QMenu *mMenu;
QAction *mShowMainAction;
QAction *mExitAppAction;
public:
void createActions();
void createMenu();
void createActions();
void createMenu();
private slots:
void on_pushButton_clicked();
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
void on_showMainAction();
void on_exitAppAction();
void on_pushButton_clicked();
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
void on_showMainAction();
void on_exitAppAction();
private:
Ui::MainWindow *ui;
};
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);
}
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//隱藏主窗口
this->hide();
{
//隱藏主窗口
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)));
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();
}
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;
}
}
{
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()));
{
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()));
connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
}
void MainWindow::createMenu()
{
mMenu = new QMenu(this);
mMenu->addAction(mShowMainAction);
{
mMenu = new QMenu(this);
mMenu->addAction(mShowMainAction);
mMenu->addSeparator();
mMenu->addAction(mExitAppAction);
mSysTrayIcon->setContextMenu(mMenu);
}
}
void MainWindow::on_showMainAction()
{
this->show();
}
{
this->show();
}
void MainWindow::on_exitAppAction()
{
exit(0);
}
————————————————
版權聲明:本文為CSDN博主「祝雲飛」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhuyunfei/article/details/51433822
{
exit(0);
}
————————————————
版權聲明:本文為CSDN博主「祝雲飛」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhuyunfei/article/details/51433822