「Qt Widget中文示例指南」如何实现一个系统托盘图标?(二)

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

System Tray Icon(系统托盘图标)示例展示了如何将带有菜单和弹出消息的图标添加到桌面环境的系统托盘中。

「Qt Widget中文示例指南」如何实现一个系统托盘图标?

系统托盘图标的截图

点击获取Qt Widget组件下载

在上文中(点击这里回顾>>),我们为大家介绍了如何定义Window类,本文将继续介绍如何实现Window类。

Window类实现

在构建编辑器小部件时,创建实际的系统托盘图标之前,我们首先创建各种编辑器元素:

Window::Window()
{
createIconGroupBox();
createMessageGroupBox();iconLabel->setMinimumWidth(durationLabel->sizeHint().width());createActions();
createTrayIcon();connect(showMessageButton, &QAbstractButton::clicked, this, &Window::showMessage);
connect(showIconCheckBox, &QAbstractButton::toggled, trayIcon, &QSystemTrayIcon::setVisible);
connect(iconComboBox, &QComboBox::currentIndexChanged,
this, &Window::setIcon);
connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &Window::messageClicked);
connect(trayIcon, &QSystemTrayIcon::activated, this, &Window::iconActivated);QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(iconGroupBox);
mainLayout->addWidget(messageGroupBox);
setLayout(mainLayout);iconComboBox->setCurrentIndex(1);
trayIcon->show();setWindowTitle(tr("Systray"));
resize(400, 300);
}

我们通过将大多数编辑器的输入小部件(包括系统托盘图标)连接到应用程序的专用槽来确保应用程序响应用户输入,但请注意可见性复选框,它的toggle()信号连接到图标的setVisible()函数。

void Window::setIcon(int index)
{
QIcon icon = iconComboBox->itemIcon(index);
trayIcon->setIcon(icon);
setWindowIcon(icon);trayIcon->setToolTip(iconComboBox->itemText(index));
}

每当图标组合框中的当前索引发生变化时,也就是说,每当用户在编辑器中选择另一个图标时,就会触发setIcon()插槽。注意,当用户用鼠标左键激活托盘图标,触发图标的activated()信号时,也会调用该函数,我们稍后会回到这个信号。

QSystemTrayIcon::setIcon()函数设置保存实际系统托盘图标的图标属性,在Windows上,系统托盘图标的大小是16x16;在X11上,首选的尺寸是22x22,图标将根据需要缩放到适当的大小。

注意在X11上,由于系统托盘规范的限制,鼠标单击图标中的透明区域将传播到系统托盘。如果这种行为是不可接受的,我们建议使用一个没有透明度的图标。

void Window::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
switch (reason) {
case QSystemTrayIcon::Trigger:
case QSystemTrayIcon::DoubleClick:
iconComboBox->setCurrentIndex((iconComboBox->currentIndex() + 1) % iconComboBox->count());
break;
case QSystemTrayIcon::MiddleClick:
showMessage();
break;
default:
;
}
}

每当用户激活系统托盘图标时它都会发出activated()信号,传递触发原因作为参数,QSystemTrayIcon提供ActivationReason enum来描述图标是如何被激活的。

在构造函数中,我们将图标的activated()信号连接到自定义的iconActivated()槽:如果用户使用鼠标左键单击了图标,该函数通过增加图标组合框的当前索引来改变图标图像,触发如上所述的setIcon()槽。如果用户使用鼠标中键激活图标,则调用自定义showMessage()槽:

void Window::showMessage()
{
showIconCheckBox->setChecked(true);
int selectedIcon = typeComboBox->itemData(typeComboBox->currentIndex()).toInt();
QSystemTrayIcon::MessageIcon msgIcon = QSystemTrayIcon::MessageIcon(selectedIcon);if (selectedIcon == -1) { // custom icon
QIcon icon(iconComboBox->itemIcon(iconComboBox->currentIndex()));
trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), icon,
durationSpinBox->value() * 1000);
} else {
trayIcon->showMessage(titleEdit->text(), bodyEdit->toPlainText(), msgIcon,
durationSpinBox->value() * 1000);
}
}

当触发showMessage()槽时,我们首先根据当前选择的消息类型检索消息图标。QSystemTrayIcon::MessageIcon enum描述了当显示气球消息时显示的图标,然后调用 QSystemTrayIcon 的showMessage()函数,在指定的毫秒时间内显示带有标题、正文和图标的消息。

macOS用户注意:QSystemTrayIcon::showMessage()显示消息需要安装Growl通知系统。

QSystemTrayIcon也有相应的messageclick()信号,该信号在用户单击showMessage()显示的消息时发出。

void Window::messageClicked()
{
QMessageBox::information(nullptr, tr("Systray"),
tr("Sorry, I already gave what help I could.\n"
"Maybe you should try asking a human?"));
}

在构造函数中,我们将messageclick()信号连接到自定义messageclick()插槽,该插槽使用QMessageBox类简单地显示一条消息。

QMessageBox提供了一个模态对话框,其中包含一条短消息、一个图标和根据当前样式布局的按钮。它支持四个严重级别:“问题”、“信息”、“警告”和“紧急”。在Qt中弹出消息框最简单的方法是调用相关的静态函数之一,例如QMessageBox::information()。

正如我们前面提到的,重新实现了几个QWidget的虚函数:

void Window::setVisible(bool visible)
{
minimizeAction->setEnabled(visible);
maximizeAction->setEnabled(!isMaximized());
restoreAction->setEnabled(isMaximized() || !visible);
QDialog::setVisible(visible);
}

我们的QWidget::setVisible()函数重新实现在编辑器的外观发生变化时更新托盘图标的菜单,例如,在调用基类实现之前最大化或最小化主应用程序窗口。

void Window::closeEvent(QCloseEvent *event)
{
if (!event->spontaneous() || !isVisible())
return;
if (trayIcon->isVisible()) {
QMessageBox::information(this, tr("Systray"),
tr("The program will keep running in the "
"system tray. To terminate the program, "
"choose <b>Quit</b> in the context menu "
"of the system tray entry."));
hide();
event->ignore();
}
}

我们已经重新实现了QWidget::closeEvent()事件处理程序来接收小部件关闭事件,并在用户关闭编辑器窗口时向他们显示上述消息。我们需要避免在用户真正打算退出应用程序时显示消息并接受关闭事件:即当用户在菜单栏中触发“退出”时,或者在托盘图标的上下文菜单中,或者在macOS上按下Command+Q快捷键时。

除了上面讨论的函数和槽,我们还实现了几个方便的函数来简化构造函数:createIconGroupBox(), createMessageGroupBox(), createActions()和createTrayIcon(),具体请参见desktop/systray/window.cpp文件。

Qt Widget组件推荐
  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1535146.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

农产品自动识别系统(Java+Springboot+SSM+Vue+Maven+二维码溯源+识别农作物CNN模型PyTorch框架)

简介&#xff1a; 本系统有前后台的区分&#xff0c;分别由用户及管理员使用&#xff0c;其中用户还可以使用移动端登录。 用户端分为注册登录模块&#xff1b;个人信息模块&#xff1b;二维码模块&#xff1b;文章模块&#xff1b;溯源信息模块&#xff1b;农产品识别模块&a…

目标检测中的解耦和耦合、anchor-free和anchor-base

解耦和耦合 写在前面 在目标检测中&#xff0c;objectness&#xff08;或 objectness score&#xff09;指的是一个评分&#xff0c;用来表示某个预测框&#xff08;bounding box&#xff09;中是否包含一个目标物体。 具体来说&#xff0c;YOLO等目标检测算法需要在每个候选区…

深入理解Python中的生成器:高效迭代与延迟计算的艺术

在处理大量数据时&#xff0c;如何有效地管理内存成为了一个关键问题。Python中的生成器&#xff08;Generator&#xff09;提供了一种优雅的解决方案&#xff0c;它允许你在迭代过程中按需生成数据&#xff0c;而不是一次性加载所有数据到内存中。本文将详细探讨生成器的工作原…

OSSEC搭建与环境配置Ubuntu

尝试使用Ubuntu配置了OSSEC&#xff0c;碰见很多问题并解决了&#xff0c;发表博客让后来者不要踩那么多坑 环境 &#xff1a; server &#xff1a;Ubuntu22.04 64位 内存4GB 处理器4 硬盘60G agent: 1.Windows11 64位 2.Ubuntu22.04 64位 服务端配置 一、配置安装依赖项&…

信息安全数学基础(11)同余的概念及基本性质

一、同余的概念 同余是一个数学概念&#xff0c;用于描述两个数在除以某个数时所得的余数相同的情况。具体地&#xff0c;设m是一个正整数&#xff0c;a和b是两个整数&#xff0c;如果a和b除以m的余数相同&#xff0c;则称a和b模m同余&#xff0c;记作a≡b(mod m)。反之&#x…

筑牢网络安全防线:为数字时代保驾护航

《筑牢网络安全防线&#xff1a;为数字时代保驾护航》 一、网络安全&#xff1a;数字时代的关键课题 网络安全在当今数字时代的重要性愈发凸显。2024 年国家网络安全宣传周以 “网络安全为人民&#xff0c;网络安全靠人民” 为主题&#xff0c;深刻体现了网络安全与每个人息息…

Django视图:构建动态Web页面的核心技术

Django&#xff0c;作为一个强大的Python Web框架&#xff0c;提供了一套完整的工具来构建这些动态页面。在Django的架构中&#xff0c;视图&#xff08;Views&#xff09;是处理用户请求并生成响应的关键组件。本文将深入探讨Django视图的工作原理&#xff0c;以及如何使用它们…

Auracast认证:蓝牙广播音频的革新之旅

低功耗音频&#xff08;LE Audio&#xff09;技术的突破&#xff0c;为蓝牙世界带来了前所未有的广播音频功能。Auracast™&#xff0c;作为蓝牙技术联盟精心打造的音频广播解决方案&#xff0c;正引领着一场全新的音频分享革命。它不仅革新了传统蓝牙技术的局限&#xff0c;更…

[进阶]面向对象之多态(练习)

需求: //父类animal package polymorphism.Test;public abstract class Animal {private int age;private String color;public Animal() {}public Animal(int age, String color) {this.age age;this.color color;}public int getAge() {return age;}public void setAge(i…

JSP经典设计模式流程分析:JSP+JavaBean设计模式+MVC设计模式

JSP两种经典设计模式 Model1设计模式:JSPJavaBean 架构图 什么是JavaBean JavaBean是一种JAVA语言写成的可重用组件&#xff0c;它遵循特定的编程规范&#xff0c;如类必须是公共的、具有无参构造函数&#xff0c;并提供getter/setter方法等。这里的JavaBean不单单指的是实体…

ESP32-WROOM-32 开篇(刚买)

简介 买了一个ESP32-WROOM-32模块的开发板, 记录板初上机细节。 模块简介 Look 连接PC 1. 解决驱动问题 https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tabdownloads 下载驱动, 如下图 解压缩下载的包&#xff0c; 然后电机64位的版本&#xff0c; 一直…

grafana升级指南

已有grafana在使用&#xff0c;需要升级新版本的grafana&#xff0c;操作如下&#xff1a; 1.先把之前的grafana文件夹整个备份 2.在grafana官网下载OSS的zip版本&#xff0c;不要msi版本 3.在原来的grafana文件夹里&#xff0c;把新版本的文件夹都复制进来&#xff0c;但是…

数据库课程 CMU15-445 2023 Fall Project-1 Buffer Pool Manager

0 实验结果 1 任务总结 本章按照任务书&#xff0c;需要完成 LRU-K替换策略磁盘调度器——后台线程接收请求&#xff0c;处理数据的读/写。缓冲池管理——使用上面完成的功能&#xff0c;来对抽象的页操作。 1.1 LRU-K替换策略 每个函数的说明都很清楚&#xff0c;按照指示…

【python计算机视觉编程——9.图像分割】

python计算机视觉编程——9.图像分割 9.图像分割9.1 图割安装Graphviz下一步&#xff1a;正文9.1.1 从图像创建图9.1.2 用户交互式分割 9.2 利用聚类进行分割9.3 变分法 9.图像分割 9.1 图割 可以选择不装Graphviz&#xff0c;因为原本觉得是要用&#xff0c;后面发现好像用不…

齐活儿了:一文读懂ERP和MRP、MES、CRM、WMS、SRM、APS等系统

ERP&#xff0c;即企业资源计划系统&#xff0c;是驱动企业资源整合与高效管理的核心引擎。它覆盖了企业财务、人力资源、研发创新、生产制造、供应链管理、采购活动、销售市场、客户服务以及资产管理这九大核心业务领域&#xff0c;形成了一个全方位、多层次的企业价值链管理体…

初学者指南:如何在Windows 11中自定义任务栏颜色,全面解析!

Windows任务栏如何修改颜色&#xff1f;任务栏可以说是电脑桌面上比较不“起眼”的东西&#xff0c;但是也有不少小伙伴会想要将自己的电脑任务栏设置得好看&#xff0c;比如说修改电脑任务栏透明度&#xff0c;以及修改任务栏颜色。 电脑任务栏设置可以修改任务栏颜色&#xf…

27 顺序表 · 链表

目录 一、单链表 &#xff08;一&#xff09;概念 1、节点 2、链表的性质 &#xff08;二&#xff09;单链表的实现 &#xff08;三&#xff09;单链表算法题 1、移除链表元素 2、反转链表 3、链表的中间节点 4、合并两个有序的单链表 5、链表分割 6、链表的回文结构…

软件设计师容易考吗?

一、软考软件设计师难吗 软考软件设计师考试对于不同的人来说&#xff0c;难度可能有所差异。然而&#xff0c;总体来说&#xff0c;软考软件设计师考试是相对较难的考试&#xff0c;需要考生具备扎实的软件设计理论知识和实践经验。 从各地2024年上半年软考合格人数的公布情…

Autosar模式管理实战系列-COMM模块状态机及重要函数讲解

1.Channel状态管理 上一节提到ComM进行通信模式管理提供有两大状态机,另外一个就是Channel状态管理。这里的Channel指的是一个通信总线,目前项目主要是采用CAN总线。ComM 模块对每一个Channel都定义了一个状态机,用于描述通道的各种状态、状态转移关系和状态转移动作。该状…

Blender插件200个分享

Blender不仅开源免费&#xff0c;插件资源也相当丰富&#xff0c;今天我们一起来看看blender软件的插件&#xff0c;其中群友给我整理提供了200多个&#xff0c;可供各位大佬享用&#xff01; PS&#xff1a;回“渲染101农场云渲码6666”&#xff0c;领取&#xff0c;大家懂滴…