了解元对象,需要先大概了解下元对象系统,可以看一下我这篇文章
https://blog.youkuaiyun.com/tuan8888888/article/details/113837962
元对象
qt 官方说明
The QMetaObject class contains meta-information about Qt objects.
The Qt Meta-Object System in Qt is responsible for the signals and slots inter-object communication mechanism, runtime type information, and the Qt property system. A single QMetaObject instance is created for each QObject subclass that is used in an application, and this instance stores all the meta-information for the QObject subclass. This object is available as QObject::metaObject().
This class is not normally required for application programming, but it is useful if you write meta-applications, such as scripting engines or GUI builders.
简单总结,
1、元对象系统,是qt 信号和槽内部对象交互的系统,运行类型信息,属性系统
2、会被每一个QObject 子类创建一个QMetaObject 实例,用来保存元信息。
3、在使用脚本引擎和GUI的builders 的应用是非常有用的
大概介绍了做什么用,但对于不太了解qt机制的同学来说还是不太清晰。接下来我结合代码来具体看看QMetaObject 可以做什么用,他和QObject的关系是什么。
和QObject的关系
想了解QMetaObject 先来看一下和QObject 的关系,根据官方的说明,我们知道在QObject的子类中会创建一个QMetaObject的实例,那我们看一下在什么地方保存的。
在QObject的类中,有一个静态的成员变量staticQtMetaObject 类型是QMetaObject,说明QMetaObject 是 QObject 的成员。
protected:
QScopedPointer<QObjectData> d_ptr;
static const QMetaObject staticQtMetaObject; //静态成员变量
friend inline const QMetaObject *qt_getQtMetaObject() Q_DECL_NOEXCEPT;
friend struct QMetaObject;
friend struct QMetaObjectPrivate;
//qt_getQtMetaObject的定义
inline const QMetaObject *qt_getQtMetaObject() Q_DECL_NOEXCEPT
{ return &QObject::staticQtMetaObject; }
Q_OBJECT
在再说元对象的时候,不得不说一下 Q_OBJECT 这个宏,大家都知道,如果需要使用信号槽,只继承QObject是不够。还需在类中加上一个Q_OBJECT宏。
下面是宏的定义,在代码中定义了一下成员变量,尤其我们比较关心的元对象,定义了一个静态的成员变量staticMetaObject,上面QObject的元对象名称(staticQtMetaObject)不一样的,少了一个Qt。而每一个子类都有一个各自的元数据。
1、大家有没有想到为什么是静态的呢ÿ