(1)本宏定义于头文件 qtmetamacros . h , 一并给出宏 Q_OBJECT 的定义用来对比 :
/* qmake ignore 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, "")
/* qmake ignore Q_OBJECT */
#define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "")
/*
QGADGET宏是 Q_OBJECT宏的轻量级版本,
适用于不继承自Q0bject但仍想使用QMeta0bject提供的某些反射功能的类。
就像Q_OBJECT宏一样,它必须出现在类定义的私有部分中。
GADGETS可以有 Q_ENUM、Q_PROPERTY和 Q_INVOKABLE,但它们不能有信号或槽。
Q_GADGET 使得类成员 staticMetaObject可用。
staticMeta0bject是QMetaObject 类型,并提供对使用 Q_ENUMS 声明的枚举的访问。
The Q_GADGET macro is a lighter version of the Q_OBJECT macro for classes that
do not inherit from QObject but still want to use some of the
reflection capabilities offered by QMetaObject. Just like the Q_OBJECT macro,
it must appear in the private section of a class definition.
Q_GADGETs can have Q_ENUM, Q_PROPERTY and Q_INVOKABLE,
but they cannot have signals or slots.
Q_GADGET makes a class member, staticMetaObject, available.
staticMetaObject is of type QMetaObject and
provides access to the enums declared with Q_ENUMS.
*/
#ifndef QT_NO_META_MACROS
/* qmake ignore Q_GADGET 英文 GADGET的意思就是小工具*/
#define Q_GADGET \
public: \
static const QMetaObject staticMetaObject; \
void qt_check_for_QGADGET_macro(); \
typedef void QtGadgetHelper; \
private: \
QT_WARNING_PUSH \
Q_OBJECT_NO_ATTRIBUTES_WARNING \
\
Q_DECL_HIDDEN_STATIC_METACALL \
static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
QT_WARNING_POP \
QT_ANNOTATE_CLASS(qt_qgadget, "") \
/*end*/
/* qmake ignore Q_NAMESPACE_EXPORT */
#define Q_NAMESPACE_EXPORT(...) \
extern __VA_ARGS__ const QMetaObject staticMetaObject; \
QT_ANNOTATE_CLASS(qt_qnamespace, "") \
/*end*/
/* qmake ignore Q_NAMESPACE */
#define Q_NAMESPACE Q_NAMESPACE_EXPORT() \
/*end*/
#endif // QT_NO_META_MACROS
(2)
谢谢