1. 程式人生 > 其它 >QT中訊號槽連線的注意點

QT中訊號槽連線的注意點

技術標籤:C++/Qtqt

最近在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);
}