Qt之訊號與槽

weixin_34104341發表於2020-04-07

有關這個概念網上有太多太多的資料了,這些資料也非常健全,比如下面這些文章,後兩篇比較高階,現在還沒完全整明白,感謝tingsking18大神

http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/

http://blog.csdn.net/tingsking18/article/details/4800828

http://blog.csdn.net/tingsking18/article/details/4991563


 接下來就來談談自己碰到的一些注意事項,關於connect訊號與槽的引數問題

1、訊號與槽中的引數個數與型別必須完全一樣,什麼意思,看下面的程式碼,曾經的一個錯誤:

connect(button, SIGNAL(clicked()), this, SLOT(sendMessage(QString)));

本意是連線qpushbutton的clicked()訊號與槽sendMessage(),其中槽有一個形參型別為QString,這樣一切編譯通過,可是除錯的時候發現根本進不了槽函式,問題就出現在訊號與槽函式的引數個數不一樣。將上述程式碼改成connect(but, SIGNAL(clicked(QString)), this, SLOT(sendMessage(QString)));即可。注意這是Qt中的使用SIGNAL()和SLOT()的一個自身的缺陷,在編譯時不會檢查這種錯誤,只有在執行時才會在程式的輸出視窗輸出錯誤。我這裡用的VS2010來除錯,觀察輸出視窗,會發現輸出了以下的錯誤:

QObject::connect: Incompatible sender/receiver arguments
MyButton::clickButton() --> onefloor::sendMessage(QString)

另外,引數型別必須完全一樣,即訊號引數為QString,槽引數也必須為QString,不能int對應QString。這就是訊號與槽中的引數個數與型別必須完全一樣的含義。

這個問題在Qt5中推薦使用一種更加安全的方法,下面再討論

2、訊號與槽函式中不能有形參名。還是看個錯誤的例子

connect(button, SIGNAL(config(QString abc)), this, SLOT(configAddr(QString str)));

還是一樣,編譯時不會報錯,執行時在輸出視窗時可以看到錯誤,最終的結果當然也是槽函式沒有響應。


 上面提到的Qt5中會推薦一種使用方法,可以避免訊號與槽連線時執行時報錯,不方便查詢錯誤。

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

針對第一個例子,也就是寫成這樣connect(button, &MyButton::clickButton, this, &onefloor::sendMessage);

這樣,就可以再編譯的時候檢查訊號與槽是否存在,並進行引數型別檢查。

有關Qt5中connect的說明,可以參考以下兩篇部落格http://blog.csdn.net/dbzhang800/article/details/6547196 和 http://www.linuxidc.com/Linux/2014-04/100581.htm

 

轉載於:https://www.cnblogs.com/jiasaidongqi/p/4417636.html

相關文章