你們好,我是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),觀看對應的的視頻版講解;謝謝對象