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


相关推荐
Chester_19996 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲7 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员8 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导8 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan8 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子8 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化8 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_695251498 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說9 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
可乐鸡翅yeah_11 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线