QT6 源(74):QT里的基础宏 Q_GADGET ,功能跟 Q_Object 差不多,用于把自定义类接入元对象系统,但不具备信号与槽的功能

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

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值