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


相关推荐
Chase_______10 分钟前
静态变量详解(static variable)
java·开发语言·jvm
救救孩子把10 分钟前
如何在n8n中突破Python库限制,实现持久化虚拟环境自由调用
开发语言·python·n8n
小皮侠1 小时前
【算法篇】逐步理解动态规划模型6(回文串问题)
java·开发语言·算法·动态规划
勤奋的小王同学~1 小时前
(javaSE)抽象类和接口:抽象类概念语法和特性, 抽象类的作用;接口的概念 接口特性 实现多个接口 接口间的继承 Object类
java·开发语言
LUCIAZZZ2 小时前
项目拓展-Jol分析本地对象or缓存的内存占用
java·开发语言·jvm·数据库·缓存·springboot
十秒耿直拆包选手2 小时前
Qt:Qt桌面程序正常退出注意事项
c++·qt
Elastic 中国社区官方博客2 小时前
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
大数据·开发语言·javascript·elasticsearch·搜索引擎·全文检索·apache
姆路2 小时前
Qt背景平铺
开发语言·qt
ningmengjing_2 小时前
js调试技巧
开发语言·javascript·ecmascript
桥豆麻袋93932 小时前
Javascript 单例模式
开发语言·javascript·单例模式