大家好,我是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->預處理->編譯->鏈接
示例代碼
Counter.h檔案
#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;
};
Counter.cpp檔案
#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 = https://www.cnblogs.com/appsucc/archive/2021/04/10/value;
emit valueChanged(value);
}
}
main.cpp檔案
#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();
}
Qt宏
宏定義在qobjectdefs.h檔案中(位于QtCore目錄)
signals
slots
Q_OBJECT
emit
SIGNAL
SLOT
Qt信號槽原始碼剖析系列會分拆為多個具體的細致講解,后續我會一一分析并發布
今天就講解到這里,更詳細的原理分析與講解,請關注微信公眾號(itwenyinan),觀看對應的的視頻版講解;謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274674.html
標籤:其他
