你们好,我是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),观看对应的的视频版讲解;谢谢编译器