一、托盘图标及相关操作示例图
1.消息通知操作
下方为消息通知操作,可能是因为录屏原因导致消息弹窗未弹出(无图标通知也会带icon,考虑是windows的原因)。
正常消息提示如下:
2.托盘图标闪烁
3.托盘图标操作响应
下方对托盘图标进行了基本的鼠标操作,值得一提的是,双击之前会先触发单击操作。
二、我所遇到的问题
- 要做闪烁操作时,需要更新图标,且我在测试时,更新的图标路径不能为空,否则没有闪烁效果。
- 要显示托盘图标需要主动调用托盘图标的show函数。
- 当笔记本通知无效时考虑是设置问题,打开下图选项即可。
三、源码
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
注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除文章来源地址https://www.toymoban.com/news/detail-415588.html
到了这里,关于Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!