在C++中,結構體/類均可用于自定義資料型別,也正是這些特性讓我們的程式變得更加的靈活,但如果是在C++中定義了某一個資料型別Class,使用該資料型別進行計算并需要在QML中使用該計算結果時怎么辦呢?Qt中C++和QML的資料自動轉化支持的資料型別:

除以上的資料型別外,C++傳遞給QML的值是無法被QML識別的,也就是自定義的資料型別是無法通過編譯系統自動轉化的,因此只能采用發送信號攜帶引數或者使用Q_INVOKABLE宏在qml中獲得回傳值,將該自定義資料型別的資料以物件的形式傳遞給QML,
例如,我自定義了資料型別PointDataF,該資料型別包含了三個屬性(方位,距離,高度),用于記錄空間中的位置資訊,構建該資料類:(注意:該自定義資料型別不能繼承自QObject,同時也不能使用Q_OBJECT宏,因為該資料型別如果我們需要以信號的方式發送出去,而不是在類中使用信號與槽(我理解就是不能自己的爸爸是自己)!因此使用Q_GADGET宏單純的實作反射功能)
PointDataF.h:
#ifndef POINTDATAF_H
#define POINTDATAF_H
#include <QMetaType>
#include <QDebug>
class PointDataF
{
Q_GADGET
Q_PROPERTY(qreal azimuth READ azimuth WRITE setAzimuth)
Q_PROPERTY(qreal distance READ distance WRITE setDistance)
Q_PROPERTY(qreal height READ height WRITE setHeight)
public:
PointDataF();
PointDataF(const PointDataF& other);
~PointDataF();
PointDataF(const qreal &azimuth, const qreal &distance,const qreal& height);
qreal azimuth() const;
qreal distance() const;
qreal height() const;
void setAzimuth(qreal);
void setDistance(qreal);
void setHeight(qreal);
private:
qreal Azimuth;
qreal Distance;
qreal Height;
};
Q_DECLARE_METATYPE(PointDataF);
QDebug operator<<(QDebug dbg, const PointDataF &pointdata);
#endif // POINTDATAF_H
PointDataF.cpp:
#include "pointdataf.h"
PointDataF::PointDataF(){
}
PointDataF::PointDataF(const PointDataF& other){
Azimuth = other.Azimuth;
Distance = other.Distance;
Height = other.Height;
}
PointDataF::PointDataF(const qreal &azimuth, const qreal &distance,const qreal& height){
Azimuth = azimuth;
Distance = distance;
Height = height;
}
PointDataF::~PointDataF(){
}
qreal PointDataF::azimuth() const{
return Azimuth;
}
qreal PointDataF::distance() const{
return Distance;
}
qreal PointDataF::height() const{
return Height;
}
void PointDataF::setAzimuth(qreal a)
{
Azimuth = a;
}
void PointDataF::setDistance(qreal d)
{
Distance = d;
}
void PointDataF::setHeight(qreal h)
{
Height = h;
}
QDebug operator<<(QDebug dbg, const PointDataF &pointdata){
dbg.space()<<"Azimuth:"<<pointdata.azimuth()<<"Distance:"<<pointdata.distance()<<"Height:"<<pointdata.height();
return dbg.maybeSpace();
}
下面分別闡述下使用信號傳遞與使用Q_INVOKABLE宏的方法:
(1)使用信號與槽機制傳遞:
在C++中使用該資料型別進行計算處理,并將處理后的資料通過信號發送給QML,注意:在發送信號前需要將PointDataF注冊到元系統中去,就可以當作信號引數發送啦!
.cpp:
qRegisterMetaType<PointDataF>("PointDataF");
PointDataF pointDataF(1.2,1.5,400.0);
qDebug()<<"PointDataF:"<<pointDataF;
emit test(pointDataF);
.qml:
Connections{
target: offlinethread
onTest:{
console.log(pointDataF.azimuth,pointDataF.distance,pointDataF.height,typeof(pointDataF))
}
}
(2)使用Q_INVOKABLE宏將函式注冊到元物件系統方法:
在.h頭檔案中使用宏:
Q_INVOKABLE PointDataF getPointDataF();
.cpp:
PointDataF OffLineThread::getPointDataF()
{
PointDataF pointDataF(1.2,1.5,400.0);
qDebug()<<"PointDataF:"<<pointDataF;
return pointDataF;
}
.qml:
var pointDataF = offlinethread.getPointDataF()
console.log(pointDataF.azimuth,pointDataF.distance,pointDataF.height,typeof(pointDataF))
程式輸出結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227995.html
標籤:其他
上一篇:初窺門徑——通過游戲人物建模來窺探python的資料模型
下一篇:BMP檔案決議及顯示
