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


相关推荐
Deng9452013143 小时前
基于Python的职位画像系统设计与实现
开发语言·python·文本分析·自然语言处理nlp·scrapy框架·gensim应用
一只小青团5 小时前
Python之面向对象和类
java·开发语言
qq_529835356 小时前
ThreadLocal内存泄漏 强引用vs弱引用
java·开发语言·jvm
景彡先生6 小时前
C++并行计算:OpenMP与MPI全解析
开发语言·c++
量子联盟7 小时前
原创-基于 PHP 和 MySQL 的证书管理系统,免费开源
开发语言·mysql·php
时来天地皆同力.9 小时前
Java面试基础:概念
java·开发语言·jvm
hackchen9 小时前
Go与JS无缝协作:Goja引擎实战之错误处理最佳实践
开发语言·javascript·golang
byxdaz9 小时前
Qt中的QObject::moveToThread方法详解
qt
铲子Zzz10 小时前
Java使用接口AES进行加密+微信小程序接收解密
java·开发语言·微信小程序
小小小新人1212311 小时前
C语言 ATM (4)
c语言·开发语言·算法