Qt信號槽源碼剖析(一)

你們好,我是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 = 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目錄)code

signals

slots

Q_OBJECT

emit

SIGNAL

SLOT

Qt信號槽源碼剖析系列會分拆爲多個具體的細緻講解,後續我會一一分析併發布視頻

今天就講解到這裏,更詳細的原理分析與講解,請關注微信公衆號(itwenyinan),觀看對應的的視頻版講解;謝謝對象

相關文章
相關標籤/搜索