QT中訊號槽連線的注意點
阿新 • • 發佈:2021-02-08
最近在QT專案開發過程中遇到了訊號槽連線的兩個坑,故記錄下來,供日後查閱!
介面類MyWidget程式碼如下:
#include <QtWidgets/QWidget>
#include "ui_MyWidget.h"
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = Q_NULLPTR);
void onOrange();
void onApple();
private:
Ui::MyWidgetClass ui ;
void Demo1();
void Demo2();
};
#include "MyWidget.h"
#include "qbuttongroup.h"
#include "qdebug.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
Demo1();
Demo2();
}
void MyWidget::onOrange()
{
qDebug() << QStringLiteral ("我是橙子!");
}
void MyWidget::onApple()
{
qDebug() << QStringLiteral("我是蘋果!");
}
一、如果訊號和槽累計被connect了n次,那麼每傳送一次訊號,槽函式會被執行n次。
void MyWidget::Demo1()
{
for (int i = 0; i < 3; ++i)
{
connect(ui.Btn1, &QPushButton::clicked, this, [=]() {
qDebug() << QStringLiteral ("我是香蕉!");
});
}
}
在Demo1中connect函式累計被執行了3次,當點選Btn1按鈕時,控制檯列印了三次“我是香蕉!”,可見,槽函式被執行了3次。
本人愚見:這大概就是為什麼我們習慣將connect函式寫在UI類的建構函式裡面的原因吧,因為UI類的建構函式只會被執行一次,所以connect函式也必然只執行一次。
但是,有時候我們也需要把connect寫在其他地方,此時需要注意的是:程式碼自身邏輯會不會導致訊號和槽被“重複連線”!
如果我們希望該訊號和槽只被連線1次,那麼建議在connect函式的第5個引數裡寫上“Qt::UniqueConnect”,這表示該訊號只能有1個槽與之連線。
二、當一個訊號與多個槽connect時,該訊號傳送後,槽函式會按照被connect的順序依次執行下去。如果不希望這樣,建議使用disconnect函式將某些已連線的訊號槽斷開。
void MyWidget::Demo2()
{
// 點選Btn2,先列印 “我是橙子!” 然後列印 “我是蘋果!”
//connect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onOrange);
//connect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onApple);
// 點選Btn2,只會列印 “我是蘋果!”(槽函式onOrange先連線後斷開)
//connect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onOrange);
//disconnect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onOrange);
//connect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onApple);
// 點選Btn2,只會列印 “我是橙子!”(槽函式onApple先連線後斷開)
//connect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onOrange);
//connect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onApple);
//disconnect(ui.Btn2, &QPushButton::clicked, this, &MyWidget::onApple);
}