元对象系统涉及很多方面,比如运行时类信息,属性信息,信号槽等等,但是其中最主要的应该是信号槽,大家也许在处理信号槽的时候都碰到过这么一个问题:为什么我没加Q_OBJECT宏,信号槽就生效不了呢?进入正题:
#define Q_OBJECT \ public: \ Q_OBJECT_CHECK \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *metaObject() const; \ virtual void *qt_metacast(const char *); \ QT_TR_FUNCTIONS \ virtual int qt_metacall(QMetaObject::Call, int, void **); \ private: \ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \ struct QPrivateSignal {};
元对象系统涉及到的主要的实现类:QMataClassInfo, QMetaEnum, QMetaDataReaderControl, QMetaObject, QMetaProperty, QMetaType,我会在之后的博文中介绍这几个类的作用。
即使是最简单只有一个信号和槽函数的头文件的moc也有接近150行,所以在这里就不贴这些代码,想了解的可以直接对着自己moc出来的cpp查看一下就好,我就直接对着这个宏声明讲了,moc文件中主要是重载了上述宏声明中那四个函数metaObject(), qt_metacast(), qt_metacall(), qt_static_metacall()。(其实信号函数的实现也是放在了