Qt 对象模型的核心是元对象系统(Meta-Object System)
Qt的对象模型是Qt核心特性的基础,它定义了对象的组织和交互方式
Qt的对象模型基于C++的面向对象编程的原则,而我们又可以大致理解为对象模型是由QObject类以及它的特性元对象系统、对象树、动态属性系统以及对象继承和多态等特性构建的。
它由以下 3 个关键部分支撑:
QObject 类:所有 Qt 对象的基类,提供了对象通信(信号槽)、事件处理、父子对象管理的基础接口。
Q_OBJECT 宏:必须添加在继承 QObject 的类中,触发 Qt 的 MOC(元对象编译器)生成元对象代码。
MOC 工具:Qt 的元对象编译器,扫描包含Q_OBJECT的头文件,生成额外的 C++ 代码(如moc_xxx.cpp),实现信号槽、反射等特性。
元对象系统包括MOC和RTTI,信号与槽是其功能,对象树属于QObject特性。
QObject默认线程亲和性为创建线程,跨线程调用需通过信号槽或moveToThread()
对象树通过父子关系管理生命周期和事件传递,与多继承和性能无关。
deleteLater()将对象加入删除队列,父对象删除时递归删除子对象。
元对象系统的构成:
元对象编译器、元对象类、元属性、方法、枚举
元对象宏:Q_OBJECT、PROPERTY、Q SIGNALS等
元对象代码生成:M0C解析元对象宏然后生成远对象代码
元对象表:元对象表是一个存储了所有类的元数据的数据结构
它在运行时被Qt的元对象系统所使用
运行时类型信息:在运行时获取对象的类型信息,包括类名、父类
和元对象
信号与槽连接:在运行时动态地连接和断开信号和槽
元对象系统运行过程
对象树: 在 Qt 中, 对于对象的管理, 采用的是树形结构, 也就是对象 QObject 以对象树的形式组织自 己, 每一个 QObject 有且仅有一个父对象, 但是可以有很多个子对象 • 生命周期: 它的构造函数有一个 parent 参数。 当用另一个对象作为父对象创建一个 QObject 时, 它会 被添加到父对象的 children ( ) 列表中, 父对象被删除的时候, 这个子对象也会被删除 ( Qt 在删除父 对象时, 首先遍历父对象的子对象列表, 然后递归删除每一个子对象)
例子