Qt中的元对象系统

      Qt的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统

      元对象系统基于以下三个方面

      (1).QObject类:为可以利用元对象系统的对象提供了基类。

      (2).Q_OBJECT宏:用于启用元对象功能,例如动态属性、信号和槽。Q_OBJECT宏内容如下:

#define Q_OBJECT \
public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static const QMetaObject staticMetaObject; \virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \virtual int qt_metacall(QMetaObject::Call, int, void **); \QT_TR_FUNCTIONS \
private: \Q_OBJECT_NO_ATTRIBUTES_WARNING \Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \QT_WARNING_POP \struct QPrivateSignal { explicit QPrivateSignal() = default; }; \QT_ANNOTATE_CLASS(qt_qobject, "")

      (3).元对象编译器(Meta-Object Compiler, MOC):为每个QObject子类提供实现元对象功能所需的代码

      MOC工具读取(reads) C++源文件。如果它发现一个或多个包含Q_OBJECT宏的类声明,它会生成另一个C++源文件,其中包含每个类的元对象代码(meta-object code)。生成的源文件要么被 #include到类的源文件中,要么更常见的是,被编译并与类的实现链接。

      通过MOC工具由mainwindow.h生成moc_mainwindow.cpp,内容类似如下图所示:信号函数的实现也在此文件中生成此.cpp文件对应的CMake命令为qt6_wrap_cpp

      元对象代码除了提供对象间通信的信号和槽机制(引入该系统的主要原因)外,还提供以下附加功能

      (1).QObject::metaObject():返回与该类相关的元对象。

      (2).QMetaObject::className():在运行时以字符串形式返回类名,无需通过C++编译器支持本机运行时类型信息(run-time type information, RTTI)。

      (3).QObject::inherits():函数返回某个对象是否是继承QObject继承树中指定类的类的实例。

      (4).QObject::tr():翻译字符串以实现国际化(internationalization)。

      (5).QObject::setProperty():通过名称动态设置属性。

      (6).QObject::property():通过名称动态获取属性。

      (7).QMetaObject::newInstance():构造该类新实例。

      qobject_cast():可以使用qobject_cast()对QObject类执行动态转换。qobject_cast()函数的行为类似于标准C++ dynamic_cast(),其优点是它不需要RTTI支持,并且可以跨动态库边界(dynamic library boundaries)工作。它尝试将其参数转换为尖括号中指定的指针类型,如果对象是正确的类型(在运行时确定),则返回非零指针,如果对象的类型不兼容,则返回nullptr。

      虽然可以使用QObject作为基类,而无需Q_OBJECT宏和元对象代码,但如果不使用Q_OBJECT宏,则信号和槽以及上面描述的其他功能都将不可用。从元对象系统的角度来看,没有元代码的QObject子类相当于其具有元对象代码的最近祖先(closest ancestor)。这意味着,例如,QMetaObject::className()将不会返回你的类的实际名称,而是返回此祖先的类名。

      强烈建议QObject的所有子类都使用Q_OBJECT宏,无论它们是否实际使用信号、槽和属性

      QMetaObject类:包含有关Qt对象的元信息(meta-information)。

      (1).Qt中的元对象系统负责信号和槽对象间通信机制、运行时类型信息和Qt属性系统。为应用程序中使用的每个QObject子类创建一个QMetaObject实例,此实例存储 QObject子类的所有元信息。此对象可用作QObject::metaObject()。

      (2).此类通常不是应用程序编程所必需的,但如果你编写元应用程序(例如脚本引擎或GUI构建器),它会很有用。

      (3).使用元对象系统的操作通常是线程安全的,因为QMetaObjects通常是编译时生成的静态只读实例(static read-only instances)。但是,如果应用程序动态修改元对象(例如,使用QQmlPropertyMap时),则应用程序必须明确同步对相应元对象的访问。

      注:以上整理的内容主要来自于Qt官方文档

      GitHub:https://github.com/fengbingchun/Qt_Test

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

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

相关文章

深入理解重排(Reflow)与重绘(Repaint),写出高性能 CSS 动画

在前端开发中,CSS 动画是提升用户体验的重要手段,但很多开发者在使用动画时并不了解浏览器背后的渲染机制,导致动画卡顿甚至影响整体性能。本文将带你深入理解 CSS 中的两大核心概念 —— 重排(Reflow) 与 重绘&#x…

<贪心算法>

前言:在主包还没有接触算法的时候,就常听人提起“贪心”,当时是layman,根本不知道说的是什么,以为很难呢,但去了解一下,发现也不过如此嘛(bushi),还以为是什么高级东西呢…

大模型快速 ASGI 服务器uvicorn

基础概念类 1. 什么是 Uvicorn,它的作用是什么? 答案:Uvicorn 是一个基于 Python 的快速 ASGI(异步服务器网关接口)服务器。它的主要作用是作为 Web 应用程序的服务器,负责接收客户端的请求,并…

2025高频面试算法总结篇【二叉树】

文章目录 直接刷题链接直达非递归实现求二叉树的深度非递归从左至右打印一颗二叉树中的所有路径判断平衡二叉树二叉搜索树中第K小的元素二叉树的完全性检验根据前&中序遍历结果重建二叉树二叉树的最近公共祖先二叉树的直径二叉树的遍历 直接刷题链接直达 非递归实现求二叉…

redis 和 MongoDB都可以存储键值对,并且值可以是复杂json,用完整例子分别展示说明两者在存储json键值对上的使用对比

Redis 存储 JSON 键值对示例 存储操作: // 存储用户信息(键:user:1001,值:JSON对象) SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介绍几种创意登录页(含完整源码)

今天为大家收集了几种不同风格的登录页,搭配动态渐变背景,效果绝对惊艳! CSS3实现动态渐变玻璃拟态登录页 一、开篇语 纯CSS实现当下最火的玻璃拟态(Morphism)风格登录页,搭配动态渐变背景,效果绝对惊艳! …

R语言之mlr依赖包缺失警告之分析

因为本地没有网络,所有相关的依赖包都是手动下载,再使用脚本一键安装的。 在使用mlr包时,执行下面的代码时,总是报各种依赖缺失,也不知道咋看FAIL信息。 # 建模与调参 # 查阅线性回归、随机森林、xgboost和KNN四种模…

无状态版的DHCPv6是不是SLAAC? 笔记250405

无状态版的DHCPv6是不是SLAAC? 笔记250405 无状态版 DHCPv6 不是 SLAAC,但二者在 IPv6 网络中可协同工作。以下是核心区别与协作关系: 本质区别 特性SLAAC无状态 DHCPv6主要功能生成 IPv6 地址(基于路由器通告的前缀)分发 DNS、…

uniapp微信小程序地图marker自定义气泡 customCallout偶尔显示不全解决办法

这个天坑问题,在微信开发工具上是不会显示出来的,只有在真机上才会偶尔出现随机样式偏移/裁剪/宽长偏移,询问社区也只是让你提交代码片段,并无解决办法。 一开始我怀疑是地图组件加载出现了问题,于是给地图加了一个v-if"reL…

LabVIEW商业软件开发注意问题

在 LabVIEW 商业软件开发进程中,性能优化、界面设计及兼容性与扩展性,对软件品质、用户体验和市场适配性起着决定性作用。下面,借助多个LabVIEW 编程特性的实际案例,深入分析这些方面的开发要点。 一、性能优化:提升软…

Ubuntu 安装 VLC

最近项目中需要用VLC查看NVR下子设备的RTSP流,特此记录,便于日后查阅。 1、安装snap $ sudo apt update $ sudo apt install snapd 2、安装vlc $ sudo snap install vlc 3、可能遇到的问题 snap beta install on ubuntu 22.04 failing to start Qt: Se…

LeetCode 3047 求交集区域内的最大正方形面积

探寻矩形交集中的最大正方形面积 在算法与数据结构的探索之路上,二维平面几何问题一直占据着独特的地位,它们不仅考验我们的空间思维能力,还要求我们能够巧妙地运用算法逻辑。今天,我们将深入剖析一道极具代表性的二维平面几何算…

【Kafka基础】Kafka 2.8以下版本的安装与配置指南:传统ZooKeeper依赖版详解

对于仍在使用Kafka 2.8之前版本的团队来说,需要特别注意其强依赖外部ZooKeeper的特性。本文将完整演示传统架构下的安装流程,并对比新旧版本差异。 1 版本特性差异说明 1.1 2.8 vs 2.8-核心区别 特性 2.8版本 2.8-版本 协调服务 可选内置KRaft模式 …

springboot+easyexcel实现下载excels模板下拉选择

定义下拉注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface ExcelDropDown {/*** 固定下拉选项*/String[] source() default {};/*** 动态数据源key(从上下文中获取)*/String sourceMethod() default "";…

第15周:注意力汇聚:Nadaraya-Watson 核回归

注意力汇聚:Nadaraya-Watson 核回归 Nadaraya-Watson 核回归是一个经典的注意力机制模型,它展示了如何通过注意力权重来对输入数据进行加权平均。以下是该内容的核心总结: 关键概念 注意力机制框架:由查询(自主提示…

adb devices报错 ADB server didn‘t ACK

ubuntu下连接手机首次使用adb devices 报错ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…

Mac下Homebrew的安装与使用

Mac下Homebrew的安装与使用 一蓑烟羽 关注 2017.10.19 11:59* 字数 515 阅读 7684评论 0喜欢 3 Homebrew简介,安装与使用 简介 Homebrew 官方网站 Homebrew是一个包管理器,用于安装Apple没有预装但你需要的UNIX工具。(比如著名的wget&am…

非常适合做后台项目的go脚手架

分享一个非常适合做后台脚手架的go项目,该项目使用gin作为mvc框架搭建。她就是Gin-vue-admin。该一个基于 vue 和 gin 开发的全栈前后端分离的开发基础平台,集成jwt鉴权,动态路由,动态菜单,casbin鉴权,表单…

优化 Django 数据库查询

优化 Django 数据库查询 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 优化 Django 数据库查询**理解 N+1 查询问题****`select_related`:外键的急加载**示例何时使用 `select_re…

大数据(5)Spark部署核弹级避坑指南:从高并发集群调优到源码级安全加固(附万亿级日志分析实战+智能运维巡检系统)

目录 背景一、Spark核心架构拆解1. 分布式计算五层模型 二、五步军工级部署阶段1:环境核弹级校验阶段2:集群拓扑构建阶段3:黄金配置模板阶段4:高可用启停阶段5:安全加固方案 三、万亿级日志分析实战1. 案例背景&#x…