Qt Connection中使用lamda表示式

2022-06-19 03:08:23 字數 1404 閱讀 1317

由於專案需求,需要在點選不同按鈕的時候設定不同的量程,但是由於量程按鈕過多(8個),如果給每個按鈕都單獨寫乙個槽函式,那麼重複**就會很多,也不便於修改

因此想要以傳參的方式來編寫槽函式,傳入乙個int引數,來設定量程,這樣就只需要將把8個按鈕的訊號繫結到同乙個槽函式,再點選的時候傳入乙個整形資料就可以完成量程設定,但是這樣遇到的乙個問題就是

clicked訊號並不能int引數,因此,決定使用lamda表示式來傳參。

槽函式**如下:

void mainwindow::add_btn_clicked(int

a)

然後手動繫結訊號和槽

connect(ui->b_add_btn1,&qpushbutton::clicked,[=](int));

connect(ui->b_add_btn2,&qpushbutton::clicked,[=](int));

此時connect函式值只需要三個引數,訊號傳送物件,訊號型別,執行函式。

關於lamda表示式中[ ]的說明:

如果寫成[=],就是把外部區域性變數、類中所有成員以值傳遞,不用乙個個寫。

如果寫成[this],類中所有成員以值傳遞,不用乙個個寫。

如果寫成[&],把外部區域性變數引用進來,不用乙個個寫。

()中的引數是需要和槽函式匹配的引數,如果沒要求,可以不填,填了反而限制訊號和槽的繫結

例如,加入現在有乙個槽函式,需要兩個引數,而訊號只有乙個引數,將引數寫道( )中,再連線的時候則會因為訊號的槽的引數不匹配,導致報錯。

而將[ = ]之後,就不需要( )中寫入任何引數,在槽函式中可以寫入任何引數。

connect(ui->e_range_btn1,&qpushbutton::clicked,[=]());

可以看到上面的槽函式中寫入了兩個引數qpushbutton *和乙個 int。

甚至可以將這個訊號繫結兩個引數數量和型別都不同的槽函式。

//

兩個槽函式

void rangebtn_clicked(qpushbutton *,int

a)void test(qstring , int a ,qpushbutton *)

//繫結訊號和槽函式

connect(ui->e_range_btn1,&qpushbutton::clicked,[=]());

//之後在點選按鈕的時候可以看到如下輸出

ssssss 1

"hello

"10

總結:在沒有特殊需求的情況下,可以在connect的時候,將lamda表示式的[ ]中填入 = ,( )中不填,之後就可以在中寫入任意的函式以及引數了。

即:[=] ()

可以給訊號繫結上任意的槽函式,而不必再受限於引數的匹配和傳遞。

程序中使用委託(程序中使用程序)

delegate void setlablevisible bool bl 隱藏控制項的委託 設定進度控制項的隱藏顯示 委託 private void setvisible bool bl else this setvisible false 隱藏狀態控制項 當在程序中需要呼叫另外乙個程序的控制項的...

php中使用mysql介紹 PHP中使用MySQL

mysql資料庫的擴充套件 擴充套件庫基本功能相似,用法基本相同,會增加一些新的特性 mysqli擴充套件庫 只能對mysql資料庫操作 pdo擴充套件 可以操作很多態別的資料庫 wamp下修改mysql資料庫密碼 三者在建立連線上的比較 pdo需要四個引數,除了資料庫管理員名稱 密碼 host 還...

C 中使用屬性

使用屬性,避免將資料成員直接暴露給外界 item always use properties instead of accessible data members.學習研究.net的早期,經常碰到一些學習c net的朋友問,要屬性這種華而不實的東西做什麼?後來做專案時也時常接到team裡的人的抱怨反...