日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Qt开发经验】Qt信号槽连接不成功问题原因汇总

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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信号槽连接不成功问题原因汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。