Qt 实战(7)元对象系统 | 7.4、属性系统:深度解析与应用
文章目录
- 一、属性系统:深度解析与应用
- 1、定义属性
- 2、属性系统的作用
- 3、属性系统工作原理
- (1)`Q_PROPERTY`宏
- (2)moc 的作用
- (3)属性在元对象中的注册
- 4、获取与设置属性
- 4.1、`QObject::property()`与`QObject::setProperty()`方法
- 4.2、注意事项
- 5、总结
前言:
Qt,作为一个跨平台的C++图形用户界面应用程序开发框架,凭借其丰富的功能集和高效的性能,在软件开发领域占据了举足轻重的地位。其中,Qt的属性系统(Property System)是Qt元对象系统(Meta-Object System)的一个重要组成部分,它提供了一种灵活的方式来定义和操作对象的属性,使得对象的数据绑定、状态监控和动态交互变得更加简单和高效。
一、属性系统:深度解析与应用
Qt中的属性系统是用于为对象添加自定义属性并管理这些属性的一种机制。它允许开发者在不修改类定义的情况下,动态地为Qt对象添加新的属性,并且能够对这些属性进行读取、设置和监听。
Qt的属性系统基于Q_PROPERTY宏与元对象系统(Meta-Object System),后者是Qt框架中的一个核心部分,负责提供对象的反射和动态特性。属性系统通过
Q_PROPERTY宏在QObject派生类中声明属性,并利用Qt的元类型系统(QMetaType System)来管理属性的类型信息。
当使用
Q_PROPERTY宏定义属性时,Qt的元对象编译器(moc)会生成一些额外的代码,这些代码包括属性的访问函数(getter和setter,如果定义了的话)、属性的元信息以及可能的其他辅助函数。这些生成的代码使得属性可以通过Qt的元对象系统进行访问和操作。
1、定义属性
在
QObject的子类中,你可以使用Q_PROPERTY宏来定义属性。这个宏的语法如下:
Q_PROPERTY(type name (READ getFunction [WRITE setFunction] | MEMBER memberName [(READ getFunction | WRITE setFunction)]) [RESET resetFunction] [NOTIFY notifySignal] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool] [USER bool] [CONSTANT] [FINAL])
其中,
type是属性的数据类型,name是属性的名称,getFunction是读取属性值的函数,setFunction是设置属性值的函数,notifySignal是属性值变化时发出的信号等。
示例:
假设我们有一个
Person类,需要为其添加一个名为age的静态属性:
#include <QObject> class Person : public QObject
{ Q_OBJECT Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged) public: explicit Person(QObject *parent = nullptr) : QObject(parent) {} int age() const { return m_age; } void setAge(int age) { if (m_age != age) { m_age = age; emit ageChanged(m_age); } } signals: void ageChanged(int age); private: int m_age;
};
2、属性系统的作用
- 数据封装:通过
Q_PROPERTY宏,属性系统允许封装数据,提供统一的接口来访问和修改对象的状态。 - 类型安全:属性系统提供了类型安全的机制,确保在运行时对属性进行操作时的数据类型正确性。
- 状态管理:属性系统可以配合信号和槽机制,实现属性值改变时的自动通知。这对于创建响应式用户界面和实现数据绑定至关重要。
3、属性系统工作原理
(1)Q_PROPERTY宏
当在 Qt 中定义一个类并使用
Q_PROPERTY宏时,这不仅仅是在声明一个属性。实际上,你是在向 Qt 框架传达关于该属性的特定信息:它的名字、类型、访问方法,以及可能的通知信号。例如:
class MyClass : public QObject {Q_OBJECTQ_PROPERTY(int myProperty READ getMyProperty WRITE setMyProperty NOTIFY myPropertyChanged)
public:...
};
(2)moc 的作用
Qt 的元对象编译器(Meta-Object Compiler,moc)在编译过程中扮演着关键角色。当它遇到
Q_OBJECT、Q_PROPERTY宏时,moc 会启动并处理类定义。moc 生成的代码为 Qt 的元对象系统提供了必要的信息,使得运行时可以进行属性查询和操作。
(3)属性在元对象中的注册
处理
Q_PROPERTY宏的结果是,相关的属性被注册到类的元对象中。这使得属性不仅可以在编译时被识别,还可以在运行时通过元对象系统动态地访问和修改。
4、获取与设置属性
4.1、QObject::property()与QObject::setProperty()方法
通过
Q_PROPERTY宏在 Qt 类中声明了一个属性后,可以使用QObject::property()与QObject::setProperty()方法通过属性名称获取与设置属性,方法声明如下:
bool QObject::setProperty(const char *name, const QVariant &value);
QVariant QObject::property(const char *name) const;
示例:
假设有一个类
MyClass,它继承自QObject并使用Q_PROPERTY宏定义了一个属性:
#include <QObject>
#include <QDebug> class MyClass : public QObject
{ Q_OBJECT Q_PROPERTY(int myInt READ myInt WRITE setMyInt NOTIFY myIntChanged) public: explicit MyClass(QObject *parent = nullptr) : QObject(parent), m_myInt(0) {} int myInt() const { return m_myInt; } void setMyInt(int value) { if (m_myInt != value) { m_myInt = value; emit myIntChanged(value); } } signals: void myIntChanged(int newValue); private: int m_myInt;
};
获取与修改属性
MyClass obj;
// 1、获取属性
QVariant value = obj.property("myInt");
if (value.isValid() && value.canConvert<int>()) { int myIntValue = value.toInt(); qDebug() << "myInt:" << myIntValue;
}
// 2、修改属性
obj.setProperty("myInt", 10);
注意:虽然
setProperty()方法可以用来设置属性值,但它依赖于元对象系统提供的机制,这可能会比直接调用setter方法稍慢一些,并且可能不会触发由setter方法发出的信号(除非在setProperty()的实现中做了特殊处理)。因此,在可能的情况下,直接调用setter方法通常是更好的选择。
4.2、注意事项
- 使用
property()和setProperty()方法时,属性的名称(作为字符串)必须与Q_PROPERTY宏中指定的名称完全匹配。 property()方法返回的QVariant类型的值可能需要转换为你需要的具体类型(如示例中的toInt()方法)。- 直接调用
setter方法通常比使用setProperty()方法更直接、更高效,并且能确保信号被正确发出。
5、总结
Qt的属性系统是一个强大而灵活的工具,它提供了类型安全、灵活的数据绑定、反射与内省以及高效的状态管理等功能。通过合理使用Qt的属性系统,可以显著提高应用程序的开发效率和可维护性。无论是开发桌面应用程序、移动应用程序还是嵌入式系统,Qt的属性系统都是不可或缺的一部分。
相关文章:
Qt 实战(7)元对象系统 | 7.4、属性系统:深度解析与应用
文章目录 一、属性系统:深度解析与应用1、定义属性2、属性系统的作用3、属性系统工作原理(1)Q_PROPERTY宏(2)moc 的作用(3)属性在元对象中的注册 4、获取与设置属性4.1、QObject::property()与Q…...
Docker核心技术:容器技术要解决哪些问题
云原生学习路线导航页(持续更新中) 本文是 Docker核心技术 系列文章:容器技术要解决哪些问题,其他文章快捷链接如下: 应用架构演进容器技术要解决哪些问题(本文)Docker的基本使用Docker是如何实…...
sklearn中的增量学习:特征提取的艺术
sklearn中的增量学习:特征提取的艺术 在机器学习领域,特征提取是构建有效模型的关键步骤。然而,并非所有数据集都适合一次性加载到内存中进行处理,尤其是在处理大规模数据集时。Scikit-learn(sklearn)提供…...
PostgreSQL 中如何处理数据的唯一性约束?
🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的唯一性约束?一、什么是唯一性约束二、为什么要设置唯一性约束…...
VAE论文阅读
在网上看到的VAE解释,发现有两种版本: 按照原来论文中的公式纯数学推导,一般都是了解生成问题的人写的,对小白很不友好。按照实操版本的,非常简单易懂,比如苏神的。但是却忽略了论文中的公式推导ÿ…...
【数据分享】2013-2022年我国省市县三级的逐月SO2数据(excel\shp格式\免费获取)
空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000——2022年的省市县三级的逐月PM2.5数据和2013-2022年的省市县三级的逐月CO数据(均可查看之前的文章获悉详情)! 本次我们分享的是我国2013——2022年的省…...
【Jmeter】记录一次Jmeter实战测试
Jmeter实战 1、需求2、实现2.1、新建线程组2.2、导入参数2.3、新建HTTP请求2.4、添加监听器2.5、结果 1、需求 查询某个接口在高并发场景下的响应时间(loadtime),需求需要响应在50ms以内,接下来用Jmeter测试一下 Jmeter安装见文章《Jemeter安装教程&am…...
volatile,最轻量的同步机制
目录 一、volatile 二、如何使用? 三、volatile关键字能代替synchronized关键字吗? 四、总结: 还是老样子,先来看一段代码: 我们先由我们自己的常规思路分析一下代码:子线程中,一直循环&…...
在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法
文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法各有不同。以下是针对每种操作系统的详细步骤: Linux 使用DHCP客户端:大多数Linux发行版都使用DHCP(动态主机配置协议)来自动获取IP地址…...
Mamba-yolo|结合Mamba注意力机制的视觉检测
一、本文介绍 PDF地址:https://arxiv.org/pdf/2405.16605v1 代码地址:GitHub - LeapLabTHU/MLLA: Official repository of MLLA Demystify Mamba in Vision: A Linear AttentionPerspective一文中引入Baseline Mamba,指明Mamba在处理各种高…...
语音识别标记语言(SSML):自动标识中文多音字
好的,以下是完整的实现代码,包括导入库、分词、获取拼音和生成 SSML 标记的全过程: import thulac from pypinyin import pinyin, Style# 初始化 THULAC thu1 thulac.thulac(seg_onlyTrue)# 测试文本 text "银行行长正在走行。"…...
排序算法与复杂度介绍
1. 排序算法 1.1 排序算法介绍 排序也成排序算法(Sort Algorithm),排序是将一组数据,依照指定的顺序进行排序的过程 1.2 排序的分类 1、内部排序: 指将需要处理的所有数据都加载到**内部存储器(内存&am…...
Kafka介绍及Go操作kafka详解
文章目录 Kafka介绍及Go操作kafka详解项目背景解决方案面临的问题业界方案ELKELK方案的问题日志收集系统架构设计架构设计组件介绍将学到的技能消息队列的通信模型点对点模式 queue发布/订阅 topicKafka介绍Kafka的架构图工作流程选择partition的原则ACK应答机制Topic和数据日志…...
DAY05 CSS
文章目录 1 CSS选择器(Selectors)8. 后代(包含)选择器9. 直接子代选择器10. 兄弟选择器11. 相邻兄弟选择器12. 属性选择器 2 伪元素3 CSS样式优先级1. 相同选择器不同样式2. 相同选择器相同样式3. 继承现象4. 选择器不同权值的计算 4 CSS中的值和单位1. 颜色表示法2. 尺寸表示法…...
HTTPS 的加密过程 详解
HTTP 由于是明文传输,所以安全上存在以下三个风险: 窃听风险,比如通信链路上可以获取通信内容。篡改风险,比如通信内容被篡改。冒充风险,比如冒充网站。 HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,…...
spring整合mybatis,junit纯注解开发(包括连接druid报错的所有解决方法)
目录 Spring整合mybatis开发步骤 第一步:创建我们的数据表 第二步:编写对应的实体类 第三步:在pom.xml中导入我们所需要的坐标 spring所依赖的坐标 mybatis所依赖的坐标 druid数据源坐标 数据库驱动依赖 第四步:编写SpringC…...
ClusterIP、NodePort、LoadBalancer 和 ExternalName
Service 定义 在 Kubernetes 中,由于Pod 是有生命周期的,如果 Pod 重启它的 IP 可能会发生变化以及升级的时候会重建 Pod,我们需要 Service 服务去动态的关联这些 Pod 的 IP 和端口,从而使我们前端用户访问不受后端变更的干扰。 …...
【Day1415】Bean管理、SpringBoot 原理、总结、Maven 高级
0 SpringBoot 配置优先级 从上到下 虽然 springboot 支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml是主流) 1 Bean管理 1.1 从 IOC 容器中获取 Bean 1.2 Bean 作品域 可以通过注解 Scope("proto…...
Git之repo sync -c与repo sync -dc用法区别(四十八)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
vite + vue3 + uniapp 项目从零搭建
vite + vue3 + uniapp 项目从零搭建 1、创建项目1.1、创建Vue3/vite版Uniapp项目1.2、安装依赖1.3、运行项目2、弹出 用户隐私保护提示 方法2.1、更新用户隐私保护指引 和 修改配置文件2.2、授权结果处理方法3、修改`App.vue`文件内容4、处理报`[plugin:uni:mp-using-component…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
