你们好,我是IT文艺男,来自一线大厂的一线程序员程序员
你们在使用Qt开发程序时,都知道怎么使用Qt的信号槽,可是Qt信号槽是怎么工做的? 大部分人仍然不知道;也就是说你们只知道怎么使用,殊不知道基于什么原理,显然这是不符合深层次发展的;那么今天我就给你们基于Qt源码以及示例代码深度剖析Qt的信号槽机制,必定会对你们有帮助。微信
当对象改变其状态时,信号就由该对象发射 (emit) 出去,并且对象只负责发送信号,它不知道另外一端是谁在接收这个信号。并发
用于接收信号,并且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与本身相链接。函数
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, 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->预处理->编译->连接指针
#pragma once #include <QtCore/QObject> class Counter : public QObject { Q_OBJECT public: Counter(); public: int value() const; public slots: void setValue(int value); signals: void valueChanged(int newValue); private: int m_value; };
#include "Counter.h" Counter::Counter():m_value(0) { } int Counter::value() const { return m_value; } void Counter::setValue(int value) { if (value != m_value) { m_value = value; emit valueChanged(value); } }
#include <QtCore/QCoreApplication> #include "Counter.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Counter counterA; Counter counterB; QObject::connect(&counterA, SIGNAL(valueChanged(int)), &counterB, SLOT(setValue(int))); counterA.setValue(10);//counterA.value()=10, counterB.value()=10 counterB.setValue(20);//counterA.value()=10, counterB.value()=20 return a.exec(); }
宏定义在qobjectdefs.h文件中(位于QtCore目录)code
Qt信号槽源码剖析系列会分拆为多个具体的细致讲解,后续我会一一分析并发布视频
今天就讲解到这里,更详细的原理分析与讲解,请关注微信公众号(itwenyinan),观看对应的的视频版讲解;谢谢对象