组成
- QObject类:是所有使用元对象系统的类的基类
- Q_OBJECT宏:使得类可以使用元对象的特性,如动态属性,信号与槽
- MOC:元对象编译器,为每个QObject的子类提供必要的代码来实现元对象系统的属性
QMetaObject定义在src/qtbase/corelib/kernel/qobjectdefs.h中
struct中data数组头部存放的是QMetaObjectPrivate数据信息
struct OMetaObjectPrivate
{
int revision;
int className;
int classInfoCount, classInfoData;
int methodCount, methodData;
int propertyCount, propertyData;
int enumeratorCount, enumeratorData;
int constructorCount, constructorData;
int flags;
int signalCount;
};
struct中static_metacall是信号或者槽函数调用的分发,由moc来生成
struct中的stringdata存放的是类的信息,比如类名,信号以及槽函数签名,以及每一项在字符串的中偏移信息
struct { // private data
SuperData superdata;
const QByteArrayData *stringdata;
const uint *data;
typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
StaticMetacallFunction static_metacall;
const SuperData *relatedMetaObjects;
void *extradata; //reserved for future use
} d;
static_metacall
:设置为moc生成对象的qt_static_metacall
方法
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); }
metaObject
:方法会返回staticMetaObject
qt_metacall
:会调用qt_static_metacall