信號槽連接實例
一:信號槽使用教程代碼
//頭文件
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 | 防止重複連接。如果當前信號和槽已經連接過了,就不再連接了。 |