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