首页 > 其他 > 详细

Qt信号槽源码剖析(二)

时间:2021-04-13 10:18:02      阅读:17      评论:0      收藏:0      [点我收藏+]

大家好,我是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),观看对应的的视频版讲解;谢谢

Qt信号槽源码剖析(二)

原文:https://www.cnblogs.com/appsucc/p/14651309.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!