Qt5訊號與槽C 11風格連線簡介

2022-01-15 04:42:29 字數 2119 閱讀 8537

最近在論壇上看到了這個方面的問題,詳見這裡。 

隨後淺淺地學習了一下子,看到了qt官方論壇上給出的說明,覺得c++11的functional連線方法還是比qt4既有的巨集連線方法有很大不同。 

官方論壇的文件:

我們在乙個簡單的dialog中,安排如下幾個訊號與槽:

class sstest : public qdialog

;//cpp

//......

void sstest::slt_1()

void sstest::slt_2(double v)

; ~~~~~^~~~~~~~~~

我們試著簡單連線sgn_test3和slt_2

connect (this,&sstest::sgn_test3,this,&sstest::slt_2);

與估計的一樣,無法編譯:

c:\...\sstest.cpp:15: error: no matching function for call to 'sstest::connect(sstest*, void (sstest::*)(double, double), sstest*, )'

connect (this,&sstest::sgn_test3,this,&sstest::slt_2);

^

此時,我們採用下面這兩種方式之一,即可:

connect (this,&sstest::sgn_test3,this,static_cast(&sstest::slt_2));

或者(c++14以上)

connect (this,&sstest::sgn_test3,this,qoverload(&sstest::slt_2));

這等於強制指定了連線方法。測試:

emit sgn_test3(1.7,2.2);

輸出:

sstest::slt_2(double v): 1.7

有了上面的經驗,面對過載已經不怕了:

//c++14風格同時指定訊號、槽的參數列

connect (this,qoverload(&sstest::sgn_test2),this,qoverload(&sstest::slt_2));

//static_cast風格同時指定訊號、槽的參數列

connect (this,static_cast(&sstest::sgn_test2),this,static_cast(&sstest::slt_2));

//訊號過載,連線到單一的槽

connect (this,static_cast(&sstest::sgn_test2),this,&sstest::slt_1);

測試:

emit sgn_test2("haha!");

emit sgn_test2(1);

輸出:

sstest::slt_2(qstring s): "haha!"

sstest::slt_2(double v): 1

sstest::slt_1()

當然,既然qt5採用的是functional機制,一定可以用lambda:

int p = 100;

connect (this,&sstest::sgn_test3,[=](double a ,double b)->void);

測試:

emit sgn_test3(1.7,2.2);

輸出:

172.2
傳統的qt4 signal-slot巨集連線相容性好,但是沒有編譯時檢查,往往會由於筆誤,產生預料之外的效果。現在,有了c++11 functional的支援,可以借助編譯器進行嚴格的型別檢查,明顯是有利於除錯了。

QT5 訊號與槽

前言 訊號與槽是qt的精華所在,也是他區分於其他軟體的關鍵地方,所以我們學習qt肯定無法繞過這一核心 當物件內部狀態發生改變,訊號就被反射,只有定義了這個訊號的類和他的子類才能發射這個訊號 訊號的宣告是在標頭檔案中進行的,qt的signals關鍵字指出進入了訊號宣告區,隨後即可宣告自己的訊號。訊號由...

訊號與槽的新語法 Qt5

在 qt5 的 qtbase staging 倉庫的 qobject connect ptr 分支中已經引入了一種全新的訊號與槽的語法。參看 new signal slot syntax possibly coming in qt 5 一文。connect slider,signal valuech...

Qt5教程 4 帶引數訊號與槽

在subwidget.h中宣告乙個signal.和之前的訊號函式重名但是有引數 void backsignal qstring 之後在subwidget.cpp的槽函式sendsignal 中也傳送該訊號 emit backsignal 子視窗請求返回 在mainwidget.h中宣告乙個槽函式來響...