【Qt开发经验】Qt信号槽连接不成功问题原因汇总
生活随笔
收集整理的這篇文章主要介紹了
【Qt开发经验】Qt信号槽连接不成功问题原因汇总
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下幾種情況會導致信號槽連接不成功,下面分別描述。
1. 擁有信號槽的類,必須繼承QObject,聲明Q_OBJECT宏。
Qt幫助手冊里搜索 “Signals & Slots”,可以看到以下說明:
想要使用信號槽,必須繼承QObject,必須加Q_OBJECT宏。
2. 信號槽函數簽名不匹配
主要分以下幾種情形:
-
信號槽參數類型不匹配:如int對double。需要特別指出的是,在參數類型屬于某命名空間時,要把命名空間寫完整!
-
信號槽參數個數不匹配;
-
數簽名只需要參數類型,不可以寫參數名稱和返回值。如:void func(int a)要寫成func(int)。
3. 連接方式為Qt::QueuedConnection時,參數類型沒有注冊。
需要使用
qRegisterMetaType<此處為變量類型名稱>("此處為變量類型名稱");來注冊。
在Qt幫助手冊中搜索qRegisterMetaType,有相關說明。
注意在連接方式為Qt::DirectConnection(阻塞式觸發),不存在此問題。因為阻塞式觸發,只需要將參數進行值傳遞,拷貝過去即可。而以Qt::QueuedConnection(消息隊列式)連接的情況下,需要將變量轉成通用數據類型QVariant存儲,而用QVariant存儲,必須要注冊此類型。
4. 兩個子線程之間在運行時,從一個線程connect另外一個線程,會提示連接不成功。
解決方法:通過主線程中轉信號。
5.connect時,信號槽函數參數只要給出類型,不要寫參數名稱。
如連接
connect(this, SIGNAL(sigOk(int)),this,SLOT(slotOk(int)))寫成下面這樣是錯誤的:
connect(this,SIGNAL(sigOk(int value)),this,SLOT(slotOk(int value)))根據需要,可以采用另外一種connect方式:
connect(this, &MyClass::sigOk, this, &MyClass::slotOk);這種方式可以不寫參數,更簡單,但是正因為不寫參數,如果出現問題,就會比較隱晦,根據實際需要使用。
本文原創發布于公眾號Qt未來工程師。
總結
以上是生活随笔為你收集整理的【Qt开发经验】Qt信号槽连接不成功问题原因汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今年首个红色预警发布!山洪泥石流来了怎么
- 下一篇: idea全局搜索搜不全的BUG