Qt5 中關於信號槽的改動

Qt5釋出對信號/槽的新方法。保證了在編譯階段即可對信號槽使用進行檢查,避免了到運行階段才發現問題的尷尬。現將舊/新的信號槽用法進行回顧總結。

Qt4中最常用的信號槽寫法:

1connect(obj1, SIGNAL(fun1(param1, param2,...)), obj2, SLOT(fun2(param1,...)));
2//編譯後
3connect(obj1, "fun1(param1, param2,...)", obj2, "fun2(param1,...)");


在程序編譯階段,程序會將函數以字符串的形式進行鏈接,程序不會檢查信號/槽函數是否存在,只有在運行期間纔會驗證是否正確。

Qt5中的新語法:

1connect(obj1, &ClassA::fun1, obj2, &ClassB::fun2);


編譯期間就會檢查信號與槽是否存在,參數類型檢查,Q_OBJECT是否存在。

相比較Qt4中的語法,有了大的改進,而且槽函數不在限定必須是slot,可以是普通的函數、類的普通成員函數、lambda函數等。但是在新的語法中又帶來了新問題,如果函數重載,有可能會造成程序的困擾,不知道該具體鏈接哪個。在此,我們有兩種方法解決。

注:以下兩種方法用在信號函數,或槽函數都可。

一:在使用connect函數前,對要鏈接的信號/槽函數使用函數指針,防止混淆。

1//類函數指針。
2void (ClassA::* p)(param1, param2, ....) = &ClassA::fun1;
3connect(obj1, p, obj2, &ClassB::fun2);


二:在connect函數中使用c++的static_cast,來進行動態轉換。

1connect(obj1, static_cast<void (ClassA::*)(param1, param2, ....)>(&ClassA::fun1),
2        obj2, &ClassB::fun2);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章