大佬教程收集整理的这篇文章主要介绍了Qt信号槽源码剖析(二),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
大家好,我是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为空
#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),观看对应的的视频版讲解;谢谢
以上是大佬教程为你收集整理的Qt信号槽源码剖析(二)全部内容,希望文章能够帮你解决Qt信号槽源码剖析(二)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。