Qt核心:元对象系统、属性系统、对象树、信号槽

news2024/11/18 17:25:53

一、元对象系统

1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制运行时类型信息和动态属性系统等。

2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。

3、要使用元对象系统的功能,需要满足以下三个条件

①、该类必须继承自 QObject 类。

②、必须在类声明的私有区域添加 Q_OBJECT 宏,该宏用于启动元对象特性,然后便可 使用动态特性、信号和槽等功能了。只有添加了这个宏, moc 才能对 里的信号与槽的代码进行预处理

③、元对象编译器(moc)为每个 QObject 的子类,提供实现了元对象特性所必须的代码。

4、元对象系统具体运行原则

①、因为元对象系统是对 C++的扩展,因此使用传统的编译器是不能直接编译启用了元 对象系统的 Qt 程序的,对此在编译 Qt 程序之前,需要把扩展的语法去掉,该功能就 是 moc 要做的事。

然后再由标准 ++编译器进行编译 。

②、moc 全称是 Meta-Object Compiler(元对象编译器),它是一个工具(类似于 qmake), 该工具读取并分析 C++源文件,若发现一个或多个包含了 Q_OBJECT 宏的类的声明, 则会生成另外一个包含了 Q_OBJECT 宏实现代码的 C++源文件(该源文件通常名称 为 moc_*.cpp) ,这个新的源文件要么被#include 包含到类的源文件中,要么被编译键 接到类的实现中(通常是使用的此种方法)。注意:新文件不会“替换”掉旧的文件, 而是与原文件一起编译。

5、其他概念

①、元对象代码:指的是 moc 工具生成的源文件的代码,其中包含有 Q_OBJECT 宏的实 现代码 ②、moc 工具的路径为:F:\app\Qt5.8.0MinGw\5.8\mingw53_32\bin

元对象系统与反射机制

reflection 模式(反射模式或反射机制):是指在运行时,能获取任意一个类对象的所有类型信息、属性、成员函数等信息的一种机制。

二、属性系统

1、属性与数据成员相似,但是属性可使用 Qt 元对象系统的功能。他们的主要差别在于存取方式不同,比如属性值通常使用读取函数(即函数名通常以 get 开始的函数)和设置函数 (即函数名通常以 set 开始的函数)来存取其值,除此种方法外,Qt 还有其他方式存取属性 值。

2、在 Qt 中属性和数据成员是两个不同的概念,他们可以相关联也可以没有联系,比如名为 a 的属性,与数据成员 a,虽然他们名称相同,若他们之间没有产生关联,则数据成员 a 与属性 a 是完全不相关的,通常,一个属性都有与之相关联的数据成员,而采用的命名规 则通常是加上 m_前缀,比如属性名为 a,则与之相关联的数据成员名称通常为 m_a。

三、信号与槽

为此 Qt 引入了一些关键字,他们是 slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc 转换为标准的 C++语句。

信号和槽其实是观察者模式的一种实现,最大限度的弱化了类之间的耦合关系

1. 相互关系

用一个信号可以连接多个槽(一对多)

多个信号可以连接一个槽(多对一)

信号可以和信号连接(转嫁)

连接可以被disconnect函数删除

2.disconnect函数
    static bool disconnect(const QObject *sender, const char *signal,
                           const QObject *receiver, const char *member);

0 可以用作通配符,分别表示“任意信号”、“任何接收对象”或“接收对象中的任何插 槽”。

sender 永远不会是 0

disconnect(&ma, 0, 0, 0); 断开与对象 ma 中的所有信号相关联的所有槽。 disconnect(&ma , SIGNAL(s()), 0, 0);断开与对象 ma 中的信号 s 相关联的所有槽。 disconnect(&ma, 0, &mb, 0); 断开 ma 中的所有信号与 mb 中的所有槽的关联

3.Qt::ConnectionType

type:用于指明信号和槽的关联方式,它决定了信号是立即传送到一个槽还是在稍后 时间排队等待传送。关联方式使用枚举 Qt::ConnectionType 进行描述,下表为其取值 及意义

每个线程都有自己的事件队列,线程在事件队列中接受信号,

对象树与生命期

tips:

回调函数:使用一个指向函数的指针去调用需要的函数, 这样就可以调用任意名称的函数(只要函数类型与指针相同即可),

枚举值默认从0开始

进程有独立的地址空间,线程共享一个地址空间

多个线程独享栈区,共享堆区、代码区、全局区

进程拥有全局唯一的ID值(PID)

线程有进程内唯一的ID值(TID)

 #define定义标识符

使用#define可以用来定义标识符,所谓标识符可以简单理解为一个能够表示一定内容的符号,其格式为

#定义 标识符 内容
#define name stuff 

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

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

相关文章

摩尔信使MThings实用功能盘点

“冗长的用户手册”与“精简的交互设计”之间势必产生一条信息鸿沟,现在就来盘点一下摩尔信使MThings有哪些隐蔽而实用的功能。 01 数据配置类 一键刷新 功能:快速读取所有位数据、寄存器数据的当前数值。 操作:双击“数值”列表头。 一键…

【MySQL】 MySQL的增删改查(进阶)--贰

文章目录 🛫新增🛬查询🌴聚合查询🚩聚合函数🎈GROUP BY子句📌HAVING 🎋联合查询⚾内连接⚽外连接🧭自连接🏀子查询🎡合并查询 🎨MySQL的增删改查(…

关于JPA +SpringBoot 遇到的一些问题及解决方法

关于JPA SpringBoot 遇到的一些问题及解决方法 一、JpaRepository相关 1.1 org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : id; nested exception is org.hibernate.QueryException: Named parameter not bound : id可以…

MobileViT论文记录

论文原文:https://arxiv.org/abs/2110.02178 源码地址(pytorch实现):https://github.com/apple/ml-cvnets 前言 MobileVit是由CNN和Transformer混合架构组成的,它利用了CNN的空间归纳偏置[1]和加速网络收敛的优势&a…

【C++面向对象侯捷】11.组合和继承

文章目录 Composition复合,表示has-aDelegation(委托),Composition by referenceInheritance继承,表示 is-a Composition复合,表示has-a Delegation(委托),Composition b…

数字IC验证高频面试问题整理—附答案(四)

好久没更新面试题目了,不少同学在后台催更,这不就来了~ 共150道验证高频面试题整理~含答案(文末可领取全部题目) Q1.illegal_bins和ignore_bins命中分别会怎么样?命中是否会计入覆盖率统计 illegal_bins 表示非法的…

activemq部署

目录 1.下载 2.java环境 3.解压启动 4.访问测试 5.问题记录 5.1.无法启动成功问题 5.2.其他服务器无法访问 1.下载 ActiveMQ 2.java环境 需要注意要求的jdk版本,否则启动不会成功 3.解压启动 tar -zxvf apache-activemq-5.18.2-bin.tar.gz 进入到目录下执行…

MATLAB实现相关性分析

目录 一.基本理论 二.两类相关系数的对比 三.相关系数的假设检验 四.MATLAB的相关操作 五.其他有关的一些列技巧 六.案例展示 七.实战操作 一.基本理论 所谓相关系数,本质上是来衡量两组数据的关系大小——对应呈现函数关心的两种变量,那么我们可以…

“信任危机”?VR数字工厂让你沉浸式漫游在工厂里

网上因为“预制菜”的问题吵的沸沸扬扬,企业工厂说预制菜都是经过精心准备和加工的食物,但是更多人还是不信任预制菜的制作,归根结底还是因为信任危机,如果说有这样一个全新的展示方式,可以将工厂加工环境1:1还原复刻在…

vuex如何安装、报错、安装版本注意事项

npm i vuex报错,为什么呢? 在2022.2.7,Vue3就变成了默认版本, Vue2中,必须要用Vuex的3版本 Vue3中,必须要用Vuex的4版本,否则会报错 npm i vuex 安装的就是4版本 如果我们需要安装3版本&…

Spire.OCR for .NET 1.9.0 Crack

Spire.OCR for .NET 是一个专业的 OCR 库,用于从 JPG、PNG、GIF、BMP 和 TIFF 格式的图像中读取文本。开发人员可以轻松地在 C# 和 VB.NET 的 .NET 应用程序中添加 OCR 功能。它支持常用的图像格式,并提供从图像中​​读取多个字符和字体、粗体和斜体样式…

如何将 JavaScript Excel XLSX 查看器添加到Web应用程序

在 JavaScript 中创建 Excel 查看器可能是一项艰巨的任务,但使用 SpreadJS JavaScript 电子表格,创建过程要简单得多。在本教程博客中,我们将向您展示如何使用 SpreadJS 的强大功能来创建一个查看器,该查看器允许您在 Web 浏览器中…

【AI视野·今日CV 计算机视觉论文速览 第251期】Thu, 21 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Thu, 21 Sep 2023 Totally 76 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚FreeU, Diffusion U-Net提升生成模型的质量。(from 南洋理工) Daily Computer Vision Papers DreamLLM: Synergistic Multi…

腾讯面试题:无网络环境,如何部署Docker镜像?

亲爱的小伙伴们,大家好!我是小米,很高兴再次和大家见面。今天,我要和大家聊聊一个特别有趣的话题——腾讯面试题:无网络环境,如何部署Docker镜像?这可是一个技术含量颇高的问题哦!废…

鼠标移入展示字体操作

鼠标移入展示字体 点击删除实行删除操作&#xff0c;点击图片文字跳转产品详情的逻辑实现 <div class"allProduct-content"><template v-for"(item, index) in obj.product" :key"index"><!-- <img :src"item.image&qu…

云原生Kubernetes:Pod控制器

目录 一、理论 1.Pod控制器 2.Deployment 控制器 3.SatefulSet 控制器 4.DaemonSet 控制器 5.Job 控制器 6.CronJob 控制器 二、实验 1.Deployment 控制器 2.SatefulSet 控制器 3.DaemonSet 控制器 4.Job 控制器 5.CronJob 控制器 三、问题 1. showmount -e 报错…

macOS 下 Termius 中文显示为乱码

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

云原生微服务 第五章 Spring Cloud Netflix Eureka集成负载均衡组件Ribbon

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第四章 Spring Cloud Netflix 之 Ribbon 文章目录 系列文章目录[TOC](文章目录) 前言1、负载均衡1.1、服务端负载均衡1.2、…

pcl--第十一节 点云外接立方体和点云模板匹配

点云外接立方体&#xff08;3D物体包容盒&#xff09; 使用pcl::MomentOfInertiaEstimation类来获取基于偏心率和惯性矩的描述符。该类还允许提取云的轴对齐和定向的边界框。但是提取的OBB并非最小可能的边界框。 原理简述 包围体&#xff08;包容盒&#xff09;是一个简单的…

编写第一个Go程序

编写第一个Go程序 1. 开发环境构建 在Go语言中&#xff0c;开发环境的构建需要设置GOPATH环境变量。在1.8版本之前&#xff0c;必须显式设置GOPATH环境变量。而在1.8版本及之后&#xff0c;如果没有设置GOPATH&#xff0c;Go将使用默认值。 在Unix系统上&#xff0c;默认值为…