你們好,我是IT文藝男,來自一線大廠的一線程序員程序員
上節視頻給你們講解了Qt信號槽的基本概念、元對象編譯器、示例代碼以及Qt宏;今天接着深刻分析,進入Qt信號槽源碼剖析系列的第二節視頻。微信
宏定義在qobjectdefs.h文件中(位於QtCore目錄)函數
#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
#define slots Q_SLOTS #define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot) #define QT_ANNOTATE_ACCESS_SPECIFIER(x)
推導出來的結果以下,即slots爲空code
#define slots
#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宏爲一個空宏; 它甚至沒有被MOC解析,換句話說,emit只是可選的,沒有任何意義(除了給開發人員一個提示)。對象
#define emit
#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
#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),觀看對應的的視頻版講解;謝謝編譯器