Qt信號槽源碼剖析(二)


大家好,我是IT文藝男,來自一線大廠的一線程序員

上節視頻給大家講解了Qt信號槽的基本概念、元對象編譯器、示例代碼以及Qt宏;今天接着深入分析,進入Qt信號槽源碼剖析系列的第二節視頻。

Qt信號槽的宏使用

宏定義在qobjectdefs.h文件中(位於QtCore目錄)

signals

#define signals Q_SIGNALS
#define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)

推導出來的結果如下,即signals就是public

#define signals public

slots

#define slots Q_SLOTS
#define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)

推導出來的結果如下,即slots為空

#define slots

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, "")

Q_OBJECT聲明一些函數以及一個靜態的QMetaObject對象, 這些函數的實現位於MOC所產生的源文件中;因此,這些函數的聲明與實現就都有了;
精簡版如下所示::

#define Q_OBJECT \
public: \
    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_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);

emit

emit宏為一個空宏; 它甚至沒有被MOC解析,換句話說,emit只是可選的,沒有任何意義(除了給開發人員一個提示)。

#define emit

SIGNAL

#ifndef QT_NO_DEBUG
#define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
#define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
#else
#define SIGNAL(a)   "2"#a
#endif

SLOT

#ifndef QT_NO_DEBUG
#define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
#define SLOT(a)     qFlagLocation("1"#a QLOCATION)
#else
#define SLOT(a)     "1"#a
#endif

對於這些宏,下節視頻我會講解MOC以及預處理之后的代碼與初始代碼的對比來幫助大家更好的理解;

今天就講解到這里,更詳細的原理分析與講解,請關注微信公眾號(itwenyinan),觀看對應的的視頻版講解;謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM