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

这篇具有很好参考价值的文章主要介绍了Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.消息通知操作

下方为消息通知操作,可能是因为录屏原因导致消息弹窗未弹出(无图标通知也会带icon,考虑是windows的原因)。
Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)
正常消息提示如下:
Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)

2.托盘图标闪烁

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

3.托盘图标操作响应

下方对托盘图标进行了基本的鼠标操作,值得一提的是,双击之前会先触发单击操作。
Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)

二、我所遇到的问题

  1. 要做闪烁操作时,需要更新图标,且我在测试时,更新的图标路径不能为空,否则没有闪烁效果。
  2. 要显示托盘图标需要主动调用托盘图标的show函数。
  3. 当笔记本通知无效时考虑是设置问题,打开下图选项即可。
    Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)

三、源码

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

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除文章来源地址https://www.toymoban.com/news/detail-415588.html

到了这里,关于Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Win11其他系统托盘图标清除无效项

    【问题描述】 “个性化任务栏其他系统托盘图标”中存在无效的应用项 图片来源 【解决方案】 win+R ,输入 regedit 打开注册表编辑器 进入路径: HKEY_CLASSES_ROOTLocal SettingsSoftwareMicrosoftWindowsCurrentVersionTrayNotify 删除其中的 IconStream 和 PastIconStream 两项 打开任务管理器,找到

    2024年02月11日
    浏览(61)
  • 完全隐藏Win 10托盘中自带的安全中心图标

    事情是这样的,每次看到这个图标总是让我不爽,即使收纳到隐藏栏之后,我也受不了。再者,如果我要是在安装第三方安全软件后,这个隐藏栏就有自带和第三方安全软件图标,而且显得冗余,所以我打算把自带的完全隐藏。 下面就是我使用的2种具体方法: 第1步: 打开

    2024年02月06日
    浏览(63)
  • Java实现Windows任务栏图标闪烁功能,托盘图标闪烁,点击任务栏打开Java窗口

      JFrame 是指一个计算机语言-java的GUI程序的基本思路是以JFrame为基础,它是屏幕上window的对象,能够最大化、最小化、关闭。 GUI主要功能是实现人与计算机等电子设备的人机交互。它是用户与操作系统之间进行数据传递和互动操控的工具,用户可以通过一定的操作实现对电子

    2024年01月24日
    浏览(36)
  • 电脑重装系统Win11托盘图标不显示如何解决

    很多小伙伴在重新安装系统之后会发现桌面上的图标不显示。特别是刚刚升级了win11系统的小伙伴,不熟悉电脑操作系统,所以自己更是不知道Win11托盘图标不显示怎么办。为此,本期小编为大家整理了Win11托盘图标不显示的解决方法,大家一起去看看吧。 工具/原料: 系统版

    2024年02月09日
    浏览(61)
  • Qt之QPainter绘制多个矩形/圆形(含源码+注释)

    下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数据(鼠标按下为起始点,鼠标释放为结束点;每次移动时的当前位置做结束点,并实时刷新,实现

    2023年04月25日
    浏览(117)
  • Qt之进程通信-IPC(QLocalServer,QLocalSocket 含源码+注释)

    如下,分别在各个界面的控件中填入key,依次连接。 如下,简单演示了server与全部、指定socket通信及接收socket发送的数据。 1.3.1 由Server主动断开连接 如下,演示了单独断开一个及断开全部的操作,其中断开操作是由server发送数据通知socket断开,server这边则等待断开返

    2024年02月11日
    浏览(42)
  • Qt之QTableView自定义排序/过滤(QSortFilterProxyModel实现,含源码+注释)

    本文过滤条件为行索引取余2等于0时返回true,且从下图中可以看到,奇偶行是各自挨在一起的。 下图添加两列条件(当前数据大于当前列条件才返回true,且多个列条件为且关系);下方添加条件分别为,”0列,条件值50“,”2列条件值40“,综合下来为0列值大于50且2列值大

    2024年02月05日
    浏览(36)
  • 【WinUI 3】用H.NotifyIcon显示系统任务栏(托盘)图标,实现程序后台运行

    Windows平台上很多需要持续后台运行的程序,都有显示任务栏图标的需求,主要来显示状态信息、提供功能菜单栏。但UWP或Windows App SDK并没有提供对应的API,相反可能是在有意的抑制此项功能,我有理由怀疑是微软的战略布局。 但很显然,这项功能目前并不能有其它完美的替

    2024年02月06日
    浏览(175)
  • Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

    下方一次绘制的图元为:矩形、圆形、箭头、画笔。 下方为添加文本操作,演示文本过多时,文本框便捷不超出编辑区边界。 下方为演示设置弹窗更新画笔颜色、画笔粗细更新后的绘制效果。 下方为截图图片拖动效果,仅支持未添加图元的情况。 下方操作为截图保存当前截

    2024年02月02日
    浏览(38)
  • Qt系统托盘的学习

    参考: Qt系统托盘程序的实现_qt托盘程序-CSDN博客 QT系统托盘应用程序-CSDN博客 代码:

    2024年01月23日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包