Qt-托盘的实现

文章目录


托盘的功能

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


相关推荐
Bunury32 分钟前
element-plus添加暗黑模式
开发语言·前端·javascript
矛取矛求1 小时前
STL C++详解——priority_queue的使用和模拟实现 堆的使用
开发语言·c++
Non importa1 小时前
【C++】新手入门指南(下)
java·开发语言·c++·算法·学习方法
pp-周子晗(努力赶上课程进度版)2 小时前
【C++】特殊类的设计、单例模式以及Cpp类型转换
开发语言·c++
海洋与大气科学2 小时前
【matlab|python】矢量棍棒图应用场景和代码
开发语言·python·matlab
菜鸟学编程o3 小时前
C++:继承
开发语言·c++
wiseyao12193 小时前
c#操作excel
开发语言·c#·excel
努力努力再努力wz3 小时前
【c++深入系列】:万字string详解(附有sso优化版本的string模拟实现源码)
java·运维·c语言·开发语言·c++
hy____1233 小时前
类与对象(上)
开发语言·c++·算法
三次握手四次挥手3 小时前
基于Python+Pytest实现自动化测试(全栈实战指南)
开发语言·python·自动化·k8s·apache·pytest·代码规范