信號與槽作為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);
經驗證以上兩種方式都可行,據說方法二官方不推薦使用,認為其不安全,目前用這種方法還沒碰到過有什么問題。
