qt之元对象系统

news/2025/2/12 3:54:32/

组成

  • QObject类:是所有使用元对象系统的类的基类
  • Q_OBJECT宏:使得类可以使用元对象的特性,如动态属性,信号与槽
  • MOC:元对象编译器,为每个QObject的子类提供必要的代码来实现元对象系统的属性

QMetaObject定义在src/qtbase/corelib/kernel/qobjectdefs.h中

QObject
QMetaObject
QMetaMethod
QMetaEnum
QMetaProperty
QMetaClassInfo
QMetaObjectPrivate
+int revision
+int className
+int classInfoCount
+int classInfoData
+int methodCount
+int methodData
+int propertyCount
+int propertyData
+int enumeratorCount
+int enumeratorData
+int constructorCount
+int constructorData
+int flags
+int signalCount
struct
+SuperData superdata
+const QByteArrayData *stringdata
+const uint *data
+StaticMetacallFunction static_metacall
+const SuperData *relatedMetaObjects
+void *extradata

struct中data数组头部存放的是QMetaObjectPrivate数据信息
struct中static_metacall是信号或者槽函数调用的分发,由moc来生成
struct中的stringdata存放的是类的信息,比如类名,信号以及槽函数签名,以及每一项在字符串的中偏移信息

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 {}; \QT_ANNOTATE_CLASS(qt_qobject, "")#define QT_TR_FUNCTIONS \ //翻译字符串,用于多语言static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \{ return staticMetaObject.tr(s, c, n); } \QT_DEPRECATED static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) \{ return staticMetaObject.tr(s, c, n); }

http://www.ppmy.cn/news/74807.html

相关文章

直播预告 | 医疗人工智能入行经验分享

(本文阅读时间:2 分钟) 或许大家从不同程度上听说或使用过智能导诊机器人、语音电子病历或是智能问诊?这些高端大气又便利的产物都是人工智能在医疗健康领域的重要应用场景产品及服务。 “AI医疗”是人工智能技术赋能医疗健康产业…

VS Code 大量 Java 新功能来袭!

大家好,欢迎来到 Visual Studio Code Java 的 4 月更新!在此博客中,我们将带来大量基础用户体验更新,其中包括调试功能改进、Maven 插件中的配置文件支持、全新 Java Project Explorer 的用户界面和 Spring Boot 项目的可视化增强…

小航编程题库GoC南海区小学四年级模拟测试题(含题库教师账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 填空题8.0分 删除编辑 答案:100 第1题画一条高度为100,粗为5的竖线。 //程序名:直线 //作者: int main() { pen.size(5)…

sys用户下为其他用户的创建私有db link的案例

文章目录 1.查询job执行情况2.确认根因3.重建DB LINK3.1使用current_schema方式3.2使用procedure方式 4.重新编译失效的对象,并手动执行job 记录一下scheduler job执行失败,而不知到job拥有者密码的情况下,如何重建私有db link的案例 1.查询j…

Cesium教程(四):调用地形服务

Cesium提供了多种现有地形数据服务接口,并且支持自定义地形数据。 CesiumTerrainProvider:高精度全球地形数据,附有光照和水面效果。地形切片使用quantized-mesh v1.0格式,Cesium使用CesiumTerrainProvider API调用该服务。 Goo…

【软考数据库案例分析】(全)

目录 1.1 案例分析概述 1.2 数据流图设计 1.3 概念结构设计 1.4 关系模式设计 1.5 SQL语言设计 1.5.1 创建表(create table) 1.5.2 修改表 (alter table) 1.5.3 删除表 (drop table) 1.5.4 索引 1.5.5 视图 1.5.6 查询语句格式 1.6.7 分组查询 1.5.8 其他操作 1.5…

Java后端入职第四天,就被要求代码回退(Git回退实战)

一、需求背景 初入职场,由于自己的失误或者对git不熟悉,把被人的代码给冲突掉了,然后需要立马回滚,对于新手开发,应该比较常见吧!或者,比较多一种情况,错误把工程add了到了暂存区,比如一些本地配置,本来就不应该提交的,又或者,开发中只提交部分代码,又想最新的提…

【KVM虚拟化】· virsh管理命令

目录 🍁libvirt架构概述 🍁使用virsh管理虚拟机 🍂常用命令总结 🍁kvm基本功能管理 🍂帮助命令 🍂KVM的配置文件存放目录 🍂查看虚拟机状态 🍂虚拟机关机与开机 🍂强制虚…