当前位置: 首页 > news >正文

Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)

文章目录

  • 一、托盘图标及相关操作示例图
    • 1.消息通知操作
    • 2.托盘图标闪烁
    • 3.托盘图标操作响应
  • 二、我所遇到的问题
  • 三、源码
    • CMainWindow.h
    • CMainWindow.cpp
    • CMainWindow.ui
  • 总结

一、托盘图标及相关操作示例图

1.消息通知操作

下方为消息通知操作,可能是因为录屏原因导致消息弹窗未弹出(无图标通知也会带icon,考虑是windows的原因)。
在这里插入图片描述
正常消息提示如下:
在这里插入图片描述

2.托盘图标闪烁

在这里插入图片描述

3.托盘图标操作响应

下方对托盘图标进行了基本的鼠标操作,值得一提的是,双击之前会先触发单击操作。
在这里插入图片描述

二、我所遇到的问题

  1. 要做闪烁操作时,需要更新图标,且我在测试时,更新的图标路径不能为空,否则没有闪烁效果。
  2. 要显示托盘图标需要主动调用托盘图标的show函数。
  3. 当笔记本通知无效时考虑是设置问题,打开下图选项即可。
    在这里插入图片描述

三、源码

CMainWindow.h

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H

#include <QTimer>
#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QAbstractButton>

QT_BEGIN_NAMESPACE
namespace Ui { class CMainWindow; }
QT_END_NAMESPACE

class CMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    CMainWindow(QWidget *parent = nullptr);
    ~CMainWindow();

private slots:
    /**
     * @brief on_systemTrayActivated 托盘图标响应槽函数
     * @param reason 响应操作(支持单击,双击,右键,滚轮按下等)
     */
    void on_systemTrayActivated(QSystemTrayIcon::ActivationReason reason);

    /**
     * @brief on_btnGroup_buttonClicked 按钮组点击槽函数
     * @param btn 点击的按钮
     */
    void on_btnGroup_buttonClicked(QAbstractButton *btn);

    /**
     * @brief on_btnTwinkle_clicked 闪烁响应槽函数
     */
    void on_btnTwinkle_clicked();

    // QObject interface
protected:
    /**
     * @brief timerEvent 定时器事件
     * @param event 定时器事件对象
     */
    void timerEvent(QTimerEvent *event);

private:
    Ui::CMainWindow *ui;

    QSystemTrayIcon *m_sysTrayIcon; // 托盘图标对象

    int             m_iTimer;   // 定时器接收变量

};
#endif // CMAINWINDOW_H

CMainWindow.cpp

#include "CMainWindow.h"
#include "ui_CMainWindow.h"

#include <QDebug>

CMainWindow::CMainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CMainWindow)
{
    ui->setupUi(this);

    // 创建托盘图标对象
    m_sysTrayIcon = new QSystemTrayIcon(this);
    // 设置托盘图标
    m_sysTrayIcon->setIcon(QIcon(":/setting.png"));
    // 设置悬浮提示文本
    m_sysTrayIcon->setToolTip(u8"托盘测试");
    // 显示托盘图标
    m_sysTrayIcon->show();

    // 托盘按钮激活信号槽
    connect(m_sysTrayIcon, &QSystemTrayIcon::activated, this, &CMainWindow::on_systemTrayActivated);
}

CMainWindow::~CMainWindow()
{
    // 释放指针对象
    delete m_sysTrayIcon;
    delete ui;
}

void CMainWindow::on_systemTrayActivated(QSystemTrayIcon::ActivationReason reason)
{
    //! 根据reason对象响应对应操作
    //! 需要对应的操作在对应模块中添加即可
    switch (reason)
    {
    case QSystemTrayIcon::Unknown:
    {
        ui->textBrowser->append(u8"未知原因");
        break;
    }
    case QSystemTrayIcon::Context:
    {
        ui->textBrowser->append(u8"上下文菜单");
        break;
    }
    case QSystemTrayIcon::DoubleClick:
    {
        ui->textBrowser->append(u8"双击");
        break;
    }
    case QSystemTrayIcon::Trigger:
    {
        ui->textBrowser->append(u8"单击");
        break;
    }
    case QSystemTrayIcon::MiddleClick:
    {
        ui->textBrowser->append(u8"滚轮按下");
        break;
    }
    default:
        break;
    }
}

void CMainWindow::on_btnGroup_buttonClicked(QAbstractButton *btn)
{
    // 获取按钮文本
    QString text = btn->text();
    // 获取点击类型
    QSystemTrayIcon::MessageIcon msgIcon = static_cast<QSystemTrayIcon::MessageIcon>(btn->property("MessageIcon").toInt());
    // 显示点击按钮的对应信息
    m_sysTrayIcon->showMessage(text + u8"标题", text, msgIcon, 1000);
}

void CMainWindow::on_btnTwinkle_clicked()
{
    if(0 == ui->btnTwinkle->text().compare(u8"停止闪烁"))
    {
        // 杀死定时器
        killTimer(m_iTimer);
        // 更新按钮文本
        ui->btnTwinkle->setText(u8"开始闪烁");
        // 恢复托盘图标
        m_sysTrayIcon->setIcon(QIcon(":/setting.png"));
    }
    else
    {
        // 启动定时器
        m_iTimer = startTimer(500);
        // 更新按钮文本
        ui->btnTwinkle->setText(u8"停止闪烁");
    }
}

void CMainWindow::timerEvent(QTimerEvent *event)
{
    // 定义标记变量
    static bool flag = false;
    //! 获取当前托盘图标字符串
    //! 此处 :/null.png 图片不存在,不过我自测的时候此处字符串不能为空
    QString iconStr = flag? ":/setting.png": ":/null.png";
    // 设置图标
    m_sysTrayIcon->setIcon(QIcon(iconStr));
    // 更新标记值
    flag = !flag;
}

CMainWindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>CMainWindow</class>
 <widget class="QMainWindow" name="CMainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>340</width>
    <height>251</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>CMainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0" rowspan="5">
     <widget class="QTextBrowser" name="textBrowser"/>
    </item>
    <item row="0" column="1">
     <widget class="QPushButton" name="btnNoIcon">
      <property name="text">
       <string>无图标通知</string>
      </property>
      <property name="MessageIcon" stdset="0">
       <number>0</number>
      </property>
      <attribute name="buttonGroup">
       <string notr="true">btnGroup</string>
      </attribute>
     </widget>
    </item>
    <item row="1" column="1">
     <widget class="QPushButton" name="btnInfomation">
      <property name="text">
       <string>信息通知</string>
      </property>
      <property name="MessageIcon" stdset="0">
       <number>1</number>
      </property>
      <attribute name="buttonGroup">
       <string notr="true">btnGroup</string>
      </attribute>
     </widget>
    </item>
    <item row="2" column="1">
     <widget class="QPushButton" name="btnWarning">
      <property name="text">
       <string>警告通知</string>
      </property>
      <property name="MessageIcon" stdset="0">
       <number>2</number>
      </property>
      <attribute name="buttonGroup">
       <string notr="true">btnGroup</string>
      </attribute>
     </widget>
    </item>
    <item row="3" column="1">
     <widget class="QPushButton" name="btnCritical">
      <property name="text">
       <string>关键通知</string>
      </property>
      <property name="MessageIcon" stdset="0">
       <number>3</number>
      </property>
      <attribute name="buttonGroup">
       <string notr="true">btnGroup</string>
      </attribute>
     </widget>
    </item>
    <item row="4" column="1">
     <widget class="QPushButton" name="btnTwinkle">
      <property name="text">
       <string>闪烁</string>
      </property>
      <property name="MessageIcon" stdset="0">
       <number>3</number>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>340</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
 <buttongroups>
  <buttongroup name="btnGroup"/>
 </buttongroups>
</ui>

总结

本文对托盘图标的细节操作并未定义,对应的操作放在对应位置即可,其余的就是注意托盘使用的问题即可。

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

相关文章:

  • 北大考研复试准备
  • 【测试开发实战】Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台
  • 同态加密的理解
  • 基于FPGA实现正弦插值算法
  • Linux命令·wc
  • ClickHouse学习笔记(三):MergeTree 原理解析
  • CnOpenData中国行政区划shp数据
  • 20美刀一个月的ChatGPT架构师,性价比逆天了
  • 非线性优化问题基本形式概述
  • Python图片相册批处理器的设计与实现批量添加图片水印、批量命名等功能
  • 264 编码 profile level 分析
  • spring5源码篇(5)——bean的依赖注入之setter注入、field注入
  • 【Note2】macvlan,sol
  • 01 | Msyql系统架构
  • new bing的chatGPT如何解析英文论文pdf
  • Java - 配置中心初体验
  • 10个杀手级应用的Python自动化脚本
  • 接口的定义和实现
  • [Java Web]JSP进阶
  • CSS - 扫盲