Qt5 中關於訊號槽的改動

2021-06-22 08:27:46 字數 955 閱讀 3313

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函式等。但是在新的語法中又帶來了新問題,如果函式過載,有可能會造成程式的困擾,不知道該具體鏈結哪個。在此,我們有兩種方法解決。

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

//類函式指標。

void (classa::* p)(param1, param2, ....) = &classa::fun1;

connect(obj1, p, obj2, &classb::fun2);

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

connect(obj1, static_cast(&classa::fun1),

obj2, &classb::fun2);

QT5 訊號與槽

前言 訊號與槽是qt的精華所在,也是他區分於其他軟體的關鍵地方,所以我們學習qt肯定無法繞過這一核心 當物件內部狀態發生改變,訊號就被反射,只有定義了這個訊號的類和他的子類才能發射這個訊號 訊號的宣告是在標頭檔案中進行的,qt的signals關鍵字指出進入了訊號宣告區,隨後即可宣告自己的訊號。訊號由...

Qt5,訊號槽關聯錯誤

一 錯誤提示 error c2664 qmetaobject connection qobject connect const qobject const char const char qt connectiontype const 無法將引數 2 從 overloaded function 轉換...

QT5中訊號槽之槽函式的使用

最近在學qt5,基於vs2010的開發環境!按照教程做的時候,在編寫自定義槽函式時,總是得不到正確的響應!苦思不得其解。後面查閱資料發現,在自定義函式在標頭檔案中的宣告時,不能夠把它當作普通函式,而要以槽函式的形式進行宣告。在登入框類中,原本的 如下 class logindialog public...