上一篇文章中介绍了如何在C++中自定义一个数据类型并将该数据类型的数传递到QML中使用,我们自定义了一个名为PointDataF的数据类型,该数据类型包含三个属性(方位,距离,高度),用于记录空间点的位置信息。当我们在C++中对许多PointDataF数据进行处理后得到一个QList<PointDataF>数列,如何将该数列传入QML中使用呢?上一篇:给QML传递在C++中自定义数据类型(Class)的数据
Qt中默认允许传递的数列类型为:
而我们自定义的数据类型数列肯定无法直接传递,因此只能使用QVariantList进行传递,首先我们创建自定义数据类型PointDataF,该数据类型需要满足以下几个条件:
-
有一个默认的公有构造函数
-
有一个公有的拷贝构造函数
-
有一个公有的折构函数
并在头文件总使用Q_DECLARE_METATYPE(PointData)宏声明,这样的自定义数据类型数据值就可以保存在QVariant对象中了。
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();
}
将PointDataF的值转为QVariant,并存入QVariantList(使用QVariant QVariant::fromValue(const T &value))
.h:
Q_INVOKABLE QVariantList getPointDataFList();
.cpp:
QVariantList OffLineThread::getPointDataFList()
{
PointDataF p1(1.2,1.5,400.0);
PointDataF p2(3.2,6.8,200);
QVariantList list;
list.append(QVariant::fromValue(p1));
list.append(QVariant::fromValue(p2));
return list;
}
.qml:
var list = offlinethread.getPointDataFList()
for(var i=0;i<list.length;i++){
console.log(list[i].azimuth,list[i].distance,list[i].height)
}
qml中数据输出结果: