欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

给QML传递在C++中自定义数据类型(Class)的数据

程序员文章站 2022-03-07 11:13:12
在C++中,结构体/类均可用于自定义数据类型,也正是这些特性让我们的程序变得更加的灵活。但如果是在C++中定义了某一个数据类型Class,使用该数据类型进行计算后需要在QML中使用该数据类型时怎么办呢?有人可能想讲C++类注册到QML中去行不行?或者调用C++中暴露的函数获得返回值?...

在C++中,结构体/类均可用于自定义数据类型,也正是这些特性让我们的程序变得更加的灵活。但如果是在C++中定义了某一个数据类型Class,使用该数据类型进行计算并需要在QML中使用该计算结果时怎么办呢?Qt中C++和QML的数据自动转化支持的数据类型:

给QML传递在C++中自定义数据类型(Class)的数据

 

除以上的数据类型外,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))

程序输出结果:

给QML传递在C++中自定义数据类型(Class)的数据

本文地址:https://blog.csdn.net/zjgo007/article/details/110183249

相关标签: Qt QML c++