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


相关推荐
OxYGC35 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说38 分钟前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
李纲明1 小时前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
第九序言T9 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
龙亘川11 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人11 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10011 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真12 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy113 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++