1. 程式人生 > >Qt5 中訊號與槽的新寫法

Qt5 中訊號與槽的新寫法

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

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

在程式編譯階段,程式會將函式以字串的形式進行連結,程式不會檢查訊號/槽函式是否存在,只有在執行期間才會驗證是否正確。

Qt5中的新語法:

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

編譯期間就會檢查訊號與槽是否存在,引數型別檢查,Q_OBJECT是否存在。

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

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

一:在使用connect函式前,對要連結的訊號/槽函式使用函式指標,防止混淆。

//類函式指標。
void (ClassA::* p)(param1, param2, ....) = &ClassA::fun1;
connect(obj1, p, obj2, &ClassB::fun2);

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

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

http://www.linuxidc.com/Linux/2014-04/100581.htm