(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)
谢谢