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

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

大家在使用Qt开发程序时,都知道怎么使用Qt的信号槽,但是Qt信号槽是怎么工作的? 大部分人仍然不知道;也就是说大家只知道怎么使用,却不知道基于什么原理,显然这是不符合深层次发展的;那么今天我就给大家基于Qt源码以及示例代码深度剖析Qt的信号槽机制,一定会对大家有帮助。

基本概念

信号

当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。

用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。

信号与槽的连接

  1. QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
  2. const QObject *receiver, const char *method,
  3. Qt::ConnectionType type = Qt::AutoConnection)

通过QObject::connect静态函数建立连接;其中sender与receiver是指向对象的指针,signal与method分别通过SIGNAL()与SLOT()宏来进行转换。

元对象编译器

MOC, the Meta Object Compiler。
Qt程序在交由标准编译器(例如MSVC)编译之前,先使用moc分析cpp头文件;如果它发现在一个头文件中包含了Q_OBJECT宏,则会生成另外一个cpp源文件(moc_文件名.cpp),该cpp源文件中包含了Q_OBJECT宏的实现、运行时信息(反射)等。因此Qt程序的完整编译过程为moc->预处理->编译->链接

示例代码

Counter.h文件

  1. #pragma once
  2. #include <QtCore/QObject>
  3. class Counter : public QObject
  4. {
  5. Q_OBJECT
  6. public:
  7. Counter();
  8. public:
  9. int value() const;
  10. public slots:
  11. void setValue(int value);
  12. signals:
  13. void valueChanged(int newValue);
  14. private:
  15. int m_value;
  16. };

Counter.cpp文件

  1. #include "Counter.h"
  2. Counter::Counter():m_value(0)
  3. {
  4. }
  5. int Counter::value() const
  6. {
  7. return m_value;
  8. }
  9. void Counter::setValue(int value)
  10. {
  11. if (value != m_value)
  12. {
  13. m_value = value;
  14. emit valueChanged(value);
  15. }
  16. }

main.cpp文件

  1. #include <QtCore/QCoreApplication>
  2. #include "Counter.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QCoreApplication a(argc, argv);
  6. Counter counterA;
  7. Counter counterB;
  8. QObject::connect(&counterA, SIGNAL(valueChanged(int)),
  9. &counterB, SLOT(setValue(int)));
  10. counterA.setValue(10);//counterA.value()=10, counterB.value()=10
  11. counterB.setValue(20);//counterA.value()=10, counterB.value()=20
  12. return a.exec();
  13. }

Qt宏

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

signals

slots

Q_OBJECT

emit

SIGNAL

SLOT

Qt信号槽源码剖析系列会分拆为多个具体的细致讲解,后续我会一一分析并发布

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

原文链接:http://www.cnblogs.com/appsucc/p/14641196.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号