Qt之信號槽(一:基本應用)

信號槽連接實例

一:信號槽使用教程代碼

//頭文件
class MyClass : public QObject 
{ 
    //Q_OBJECT是個宏,要想使用信號槽必須是QObject的子孫類,且必須在頭文件中使用這個宏
    Q_OBJECT 
signals: //信號定義區     信號也是函數,但是不用實現
    void mySignal();
    void mySignal_2(QString arg1);
private slots:
    void myslot();
    void myslot(QString arg1);
};

//cpp文件
MyClass::MyClass(){
    //信號槽的正常連接  參數相等
    connect(this, SIGNAL(mySignal()), this, SLOT(myslot()), Qt::AutoConnection);
    connect(this, SIGNAL(mySignal_2(QString)), this, SLOT(myslot(QString)), Qt::AutoConnection);
    //信號一定要比槽函數的參數多
    connect(this, SIGNAL(mySignal_2(QString)), this, SLOT(myslot()), Qt::AutoConnection);

//信號的發送
    emit myslot();
    QString arg;
    emit myslot(arg);
}

void MyClass::myslot(){

}
void MyClass::myslot(QString arg1){
}

 

二:信號槽的連接

//信號槽的連接方式一:
//參數一共有五個:分別是發送者,信號的地址,接收者, 響應的參數  連接類型
connect(QObject*sender, QObject::signal, QObject*receiver, QObject::method,Qt::ConnectionType type = Qt::AutoConnection) 

//信號槽的連接方式二: 參數和一相同,只是採用了:SIGNAL(),SLOT()的表現形式
connect(QObject*sender, SIGNAL(signal()), QObject*receiver, SLOT(method()), Qt::ConnectionType type = Qt::AutoConnection) 

//信號槽的連接方式三:  五參數的lambda表達式
connet(QObject *sender,QObject::signal,[&](){;})

三:信號槽連接的第五個參數介紹

連接類型參數 介紹
Qt::AutoConnection 自動連接:默認的方式。信號發出的線程和糟的對象在一個線程的時候相當於:DirectConnection, 如果是在不同線程,則相當於QueuedConnection
Qt::DirectConnection 直接連接:相當於直接調用槽函數,但是當信號發出的線程和槽的對象不再一個線程的時候,則槽函數是在發出的信號中執行的。
Qt::QueuedConnection 隊列連接:內部通過postEvent實現的。不是實時調用的,槽函數永遠在槽函數對象所在的線程中執行。如果信號參數是引用類型,則會另外複製一份的。線程安全的。
Qt::BlockingQueuedConnection 阻塞連接:此連接方式只能用於信號發出的線程 和 槽函數的對象不再一個線程中才能用。通過信號量+postEvent實現的。不是實時調用的,槽函數永遠在槽函數對象所在的線程中執行。但是發出信號後,當前線程會阻塞,等待槽函數執行完畢後才繼續執行。
Qt::UniqueConnection 防止重複連接。如果當前信號和槽已經連接過了,就不再連接了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章