最近在論壇上看到了這個方面的問題,詳見這裡。
隨後淺淺地學習了一下子,看到了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中宣告乙個槽函式來響...