Qt5釋出對信號/槽的新方法。保證了在編譯階段即可對信號槽使用進行檢查,避免了到運行階段才發現問題的尷尬。現將舊/新的信號槽用法進行回顧總結。
Qt4中最常用的信號槽寫法:
1 | connect(obj1, SIGNAL(fun1(param1, param2,...)), obj2, SLOT(fun2(param1,...))); |
2 | //編譯後 |
3 | connect(obj1, "fun1(param1, param2,...)" , obj2, "fun2(param1,...)" ); |
在程序編譯階段,程序會將函數以字符串的形式進行鏈接,程序不會檢查信號/槽函數是否存在,只有在運行期間纔會驗證是否正確。
Qt5中的新語法:
1 | connect(obj1, &ClassA::fun1, obj2, &ClassB::fun2); |
編譯期間就會檢查信號與槽是否存在,參數類型檢查,Q_OBJECT是否存在。
相比較Qt4中的語法,有了大的改進,而且槽函數不在限定必須是slot,可以是普通的函數、類的普通成員函數、lambda函數等。但是在新的語法中又帶來了新問題,如果函數重載,有可能會造成程序的困擾,不知道該具體鏈接哪個。在此,我們有兩種方法解決。
注:以下兩種方法用在信號函數,或槽函數都可。
一:在使用connect函數前,對要鏈接的信號/槽函數使用函數指針,防止混淆。
1 | //類函數指針。 |
2 | void (ClassA::* p)(param1, param2, ....) = &ClassA::fun1; |
3 | connect(obj1, p, obj2, &ClassB::fun2); |
二:在connect函數中使用c++的static_cast,來進行動態轉換。
1 | connect(obj1, static_cast < void (ClassA::*)(param1, param2, ....)>(&ClassA::fun1), |
2 | obj2, &ClassB::fun2); |