歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Qt5 中關於信號槽的改動

Qt5 中關於信號槽的改動

日期:2017/3/1 9:45:10   编辑:Linux編程

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

推薦閱讀:

Ubuntu 環境下Gtk與QT編譯環境安裝與配置 http://www.linuxidc.com/Linux/2013-08/88539.htm

Linux系統下QT環境搭建 http://www.linuxidc.com/Linux/2013-07/87576.htm

Ubuntu下QT控制台程序無法運行的解決方案以及XTerm的配置方法 http://www.linuxidc.com/Linux/2013-06/86244.htm

Ubuntu 10.04下QT4.7.4移植詳解 http://www.linuxidc.com/Linux/2013-01/77930.htm

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);

Qt 的詳細介紹:請點這裡
Qt 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved