Qt-托盘的实现
文章目录
- 托盘的功能
- QSystemTrayIcon 类
- QSystemTrayIcon类的常用函数
- 代码实现
托盘的功能
GUI 程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
QSystemTrayIcon 类
托盘功能实现主要使用的类:
QSystemTrayIcon
。
QSystemTrayIcon 是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击、双击、显示指定消息、显示菜单等。此类中有两个枚举类型,分别如下:
QSystemTrayIcon类的常用函数
1、void setIcon(const QIcon& icon);
主要用来设置托盘中的图标,通常与QIcon结合使用:
QIcon icon = QIcon(":/images/app.png");m_systemtray->setIcon(icon);
2、void setToolTip(const QString &tip);
设置鼠标悬停时的提示语;
m_systemtray->setToolTip("Test!!!!!");
3、void showContextMenu(QMenu *menu);
获取鼠标点击事件,当点击图标弹出的菜单;
m_systemtray->setContextMenu(m_menu);
4、void show();
功能:在系统托盘中显示图标;
m_systemtray->show();
5、void showMessage();
系统提示消息;
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
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMenu>
#include <QAction>
#include <QSystemTrayIcon>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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
#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();
。