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爲空code

#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),觀看對應的的視頻版講解;謝謝編譯器

相關文章
相關標籤/搜索