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

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

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/)

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

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QSystemTrayIcon是一个在系统托盘中显示图标的类,它可以在系统托盘中显示一个图标,当用户点击这个图标时,可以触发相应的事件。在QT使用QSystemTrayIcon需要注意以下几点: 1. 在构造QSystemTrayIcon对象之前,需要先判断系统是否支持系统托盘。可以使用`QSystemTrayIcon::isSystemTrayAvailable()`函数进行判断。 2. 在程序退出之前,需要手动删除QSystemTrayIcon对象,否则可能会导致程序崩溃。可以在析构函数中删除QSystemTrayIcon对象。 3. QSystemTrayIcon可以设置一个ToolTip,当鼠标悬停在系统托盘图标上时,会显示这个ToolTip。可以使用`QSystemTrayIcon::setToolTip()`函数设置ToolTip。 以下是一个简单的示例代码,演示如何在系统托盘中显示一个图标: ```c++ #include <QApplication> #include <QSystemTrayIcon> #include <QMenu> int main(int argc, char *argv[]) { QApplication a(argc, argv); if (!QSystemTrayIcon::isSystemTrayAvailable()) { // 如果系统不支持系统托盘,直接退出程序 return 0; } QSystemTrayIcon trayIcon; trayIcon.setIcon(QIcon(":/icon.png")); trayIcon.setToolTip("This is a tooltip"); trayIcon.show(); return a.exec(); } ``` 在这个示例中,我们创建了一个QSystemTrayIcon对象,设置了一个图标和一个ToolTip,并显示在系统托盘中。运行这个程序,你会看到一个图标出现在系统托盘中,并且当鼠标悬停在图标上时,会显示一个ToolTip。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lw向北.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值