在QT程序设计当中,最重要的类别是QObject(定义于SRC\CORELIB\KERNEL\qobject.h),几乎所有的类别都是从这个类别继承来的。而这个类别也如MFC下面的CObject一样,承载了整个QT程序的运行,各个类别通过QObject组成一棵对象树,以便于所有没有被程序员处理的消息都能够得到默认的处理。
类同于MFC喜欢将很多东西用宏包装起来,QT也利用了类似的手段。在QObject类别当中,第一个宏便是Q_OBJECT。顺着代码搜索下去,这个宏的定义可以在编译的时候展开为如下所示。这个宏必须在私有区域添加,使得类别支持信号和槽函数。(Q_OBJECT的定义在SRC\CORELIB\KERNEL\qobjectdefs.h当中)
#define Q_OBJECT \
public: \
Q_OBJECT_CHECK \
static const QMetaObject staticMetaObject; \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
private: \
static const QMetaObjectExtraData staticMetaObjectExtraData; \
static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
上面是整个Q_OBJECT的定义,在同一个文件当中搜索就可以看到Q_OBJECT_CHECK的定义,展开如下:
#define Q_OBJECT_CHECK \
template <typename T> inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const \
{ int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument);