元对象系统(The Meta-Object System)
Qt官方帮助文档是这样描述Qt元对象系统的:
也就是说Qt的元对象系统呢,为对象之间的交互提供了信号槽机制,运行时信息和动态属性系统。怎么理解,先不忙深入理解,跟着官方文档走一遍。
元对象系统基于
大意是说,要想用上元对象系统,咱得满足这三步:
- Qobject类作为所有要利用元对象系统的基类。(第一步:基于Qobject类派生子类)
- 在类的private段声明Q_OBJECT宏,以可以使用元对象特性,例如动态属性,信号与槽。(第二步:声明Q_OBJECT宏)
- 元对象编译器为Qobject子类提供了必要的代码以实现元对象特性。(第三步:元对象编译阶段为已声明Q_OBJECT宏的Qobject子类包含实现元对象特性的代码)
Moc工具读取C++源文件。如果找到一个或多个类声明包含Q_OBJECT宏。它为每个类生成另外的一个包含元对象代码C++源文件。这些生成的源文件不仅仅包含到类的源文件中,而且类在编译和链接都用到。
元对象系统附加功能
- QObject::metaObject()返回类相关联的元对象。
- QMetaObject::className()返回运行时类名,不需要用C++编译器的RTTI。
- QObject::inherits() 返回一个对象是否是Qobject继承树的一个类的实例。
- QObject::tr() 和 QObject::trUtf8() 转换一个字符串实现国际化。
- QObject::setProperty() 和 QObject::property()通过名称动态设置和获取属性。
- QMetaObject::newInstance() 创建类的一个实例。
深入理解元对象系统
Qobject类
上节说到,Qobject类是所有要利用元对象系统的基类,还有其强大的Q_OBJECT宏,来一起探索一下:
QObject类是所有Qt对象的基类,Qt对象模型的核心。