it文艺男的个人主页

http://www.qtcn.org/bbs/u/208164  [收藏] [复制]

it文艺男

  • 0

    关注

  • 4

    粉丝

  • 25

    访客

  • 等级:新手上路
  • 总积分:14
  • 男,1986-12-09

最后登录:2021-04-19

更多资料

日志

(文字版)Qt信号槽源码剖析(二)

2021-04-17 15:01
大家好,我是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),观看对应的的视频版讲解;谢谢
分类:默认分类|回复:0|浏览:255|全站可见|转载
 

下一篇:

上一篇:

Powered by phpwind v8.7 Certificate Copyright Time now is:05-19 06:51
©2005-2016 QTCN开发网 版权所有 Gzip disabled