大家好,我是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),觀看對應的的視頻版講解;謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/275300.html
標籤:C++
上一篇:Tomcat啟動正常,但Maven專案運行出現404,求大佬解答
下一篇:070_JSP詳解
