经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
Qt信号槽源码剖析(二)
来源:cnblogs  作者:IT文艺男  时间:2021/4/13 1:31:06  对本文有异议

大家好,我是IT文艺男,来自一线大厂的一线程序员

上节视频给大家讲解了Qt信号槽的基本概念、元对象编译器、示例代码以及Qt宏;今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频。

Qt信号槽的宏使用

宏定义在qobjectdefs.h文件中(位于QtCore目录)

signals

  1. #define signals Q_SIGNALS
  2. #define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
  3. #define QT_ANNOTATE_ACCESS_SPECIFIER(x)

推导出来的结果如下,即signals就是public

  1. #define signals public

slots

  1. #define slots Q_SLOTS
  2. #define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
  3. #define QT_ANNOTATE_ACCESS_SPECIFIER(x)

推导出来的结果如下,即slots为空

  1. #define slots

Q_OBJECT

  1. #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所产生的源文件中;因此,这些函数的声明与实现就都有了;
精简版如下所示::

  1. #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只是可选的,没有任何意义(除了给开发人员一个提示)。

  1. #define emit

SIGNAL

  1. #ifndef QT_NO_DEBUG
  2. #define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
  3. #define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
  4. #else
  5. #define SIGNAL(a) "2"#a
  6. #endif

SLOT

  1. #ifndef QT_NO_DEBUG
  2. #define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
  3. #define SLOT(a) qFlagLocation("1"#a QLOCATION)
  4. #else
  5. #define SLOT(a) "1"#a
  6. #endif

对于这些宏,下节视频我会讲解MOC以及预处理之后的代码与初始代码的对比来帮助大家更好的理解;

今天就讲解到这里,更详细的原理分析与讲解,请关注微信公众号(itwenyinan),观看对应的的视频版讲解;谢谢

原文链接:http://www.cnblogs.com/appsucc/p/14651309.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号