文章目录
-
- 托盘的功能
- [QSystemTrayIcon 类](#QSystemTrayIcon 类)
- QSystemTrayIcon类的常用函数
- 代码实现
托盘的功能
GUI 程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
QSystemTrayIcon 类
托盘功能实现主要使用的类:
QSystemTrayIcon
。QSystemTrayIcon 是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击、双击、显示指定消息、显示菜单等。此类中有两个枚举类型,分别如下:

QSystemTrayIcon类的常用函数
1、void setIcon(const QIcon& icon);
主要用来设置托盘中的图标,通常与QIcon结合使用:
c
QIcon icon = QIcon(":/images/app.png");
m_systemtray->setIcon(icon);

2、void setToolTip(const QString &tip);
设置鼠标悬停时的提示语;
c
m_systemtray->setToolTip("Test!!!!!");

3、void showContextMenu(QMenu *menu);
获取鼠标点击事件,当点击图标弹出的菜单;
c
m_systemtray->setContextMenu(m_menu);

4、void show();
功能:在系统托盘中显示图标;
c
m_systemtray->show();
5、void showMessage();
系统提示消息;
c
void Widget::showMessage()
{
/*
void showMessage(const QString &title, const QString &msg,
QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information, int msecs = 10000);
*/
m_systemtray->showMessage("Information",//消息窗口标题
"There is an message!",//消息内容
QSystemTrayIcon::MessageIcon::Information,//消息窗口图标
5000);//消息窗口显示时长
}
代码实现
widget.h
c
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMenu>
#include <QAction>
#include <QSystemTrayIcon>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
//显示主界面
void showWindow();
//鼠标点击显示系统提示消息
void showMessage();
//显示托盘菜单
void showMenu();
//退出应用
void quit();
//获取当前鼠标点击事件
void activeTray(QSystemTrayIcon::ActivationReason reason);
//点击按钮隐藏窗口到系统托盘
void on_pushButton_clicked();
private:
Ui::Widget *ui;
//创建一个托盘
QSystemTrayIcon *m_systemtray;
//创建一个托盘菜单
QMenu *m_menu;
//定义菜单事件
QAction *m_action1;
QAction *m_action2;
QAction *m_action3;
};
#endif // WIDGET_H
widget.cpp
c
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint);
//定义一个托盘
m_systemtray = new QSystemTrayIcon(this);
//定义一个菜单
m_menu = new QMenu(this);
//定义菜单事件
m_action1 = new QAction(m_menu);
m_action2 = new QAction(m_menu);
m_action3 = new QAction(m_menu);
//给菜单事件命名
m_action1->setText("Show Window");
m_action2->setText("Show Message");
m_action3->setText("quit");
//将菜单事件添加到菜单中
m_menu->addAction(m_action1);
m_menu->addAction(m_action2);
m_menu->addAction(m_action3);
//关联触发事件
connect(m_action1 , &QAction::triggered , this , &Widget::showWindow);
connect(m_action2 , &QAction::triggered , this , &Widget::showMessage);
connect(m_action3 , &QAction::triggered , this , &Widget::quit);
//将菜单添加到托盘对象中
m_systemtray->setContextMenu(m_menu);
//点击托盘触发
connect(m_systemtray , &QSystemTrayIcon::activated , this , &Widget::activeTray);
connect(m_systemtray , &QSystemTrayIcon::messageClicked , this , &Widget::showWindow);
}
Widget::~Widget()
{
delete ui;
}
void Widget::showWindow()
{
this->show();
}
void Widget::showMessage()
{
m_systemtray->showMessage("Information",//消息窗口标题
"There is an message!",//消息内容
QSystemTrayIcon::MessageIcon::Information,//消息窗口图标
5000);//消息窗口显示时长
}
void Widget::showMenu()
{
m_menu->show();
}
void Widget::quit()
{
this->close();
}
void Widget::activeTray(QSystemTrayIcon::ActivationReason reason)
{
switch(reason){
case QSystemTrayIcon::Context:
showMenu();
break;
case QSystemTrayIcon::DoubleClick:
showWindow();
break;
case QSystemTrayIcon::Trigger:
showMessage();
break;
}
}
void Widget::on_pushButton_clicked()
{
this->hide();
QIcon icon = QIcon(":/images/app.png");
m_systemtray->setIcon(icon);
m_systemtray->setToolTip("Test!!!!!");
m_systemtray->show();
}
主要逻辑 :
1、点击图标
QSystemTrayIcon::ActivationReason
,触发鼠标点击connect
事件,单击右键showMenu();
、双击左键showWindow();
、单击左键showMessage();
2、定义托盘对象,添加菜单,单击右键
showMenu();
,点击m_action
触发connect
事件,connect(m_action1,&QAction::triggered,this,&Widget::showWindow);
3、在主窗口设置一个按钮
on_pushButton_clicked
,点击按钮后触发托盘事件,将当前窗口hide();
,在系统托盘中显示m_systemtray->show();
。