大家好,我是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),觀看對應的的視頻版講解;謝謝
