Qt信號與槽傳遞自定義數據類型——兩種解決方法


信號與槽作為qt中的核心機制,在qt應用開發中經常會用的,但是原生的信號與槽連接傳參,只支持基本的數據類型,比如char,int, float,double。

如果想要在信號與槽之間傳遞自定義參數,比如結構體,類等,就必須特別注意,因為在編譯的時候不會報錯,但是在執行的時候會報錯,出現失效。

如下:

信號與槽函數連接如下:

 connect(&subThread,SIGNAL(notifyGps(unsigned char, GpsLocation)), this, SLOT(onNotifyGps(unsigned char , GpsLocation)));

主要用來接收gps上報的的數據,用來顯示定位以及指南針轉型,及錄像水印等。

編譯的時候不會出現報錯,但是執行的時候輸出錯誤信息如下:

QObject::connect: Cannot queue arguments of type 'GpsLocation'
(Make sure 'GpsLocation' is registered using qRegisterMetaType().)

有兩種方法解決可以解決自定義參數的傳遞:

一、使用qRegisterMetaType()先注冊自定義類型。

1、包含頭文件

#include <QMetaType>

2、注冊自定義類型

qRegisterMetaType<GpsLocation>("GpsLocation");

3、使用自定義類型建立連接

connect(&subThread,SIGNAL(notifyGps(unsigned char, GpsLocation)), this, SLOT(onNotifyGps(unsigned char , GpsLocation)));

#include <QMetaType>
............................
qRegisterMetaType<GpsLocation>("GpsLocation");
connect(&subThread,SIGNAL(notifyGps(unsigned char, GpsLocation)), this, SLOT(onNotifyGps(unsigned char , GpsLocation)));

 

二、使用直接連接方式_Qt::DrectConnection
connect(&subThread,SIGNAL(notifyGps(unsigned char, GpsLocation)), this, SLOT(onNotifyGps(unsigned char , GpsLocation)),Qt::DrectConnection);

經驗證以上兩種方式都可行,據說方法二官方不推薦使用,認為其不安全,目前用這種方法還沒碰到過有什么問題。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM