C++传数据给Qml

请添加图片描述


传递简单数据

C++传递简单的数据给QML的方式有如下两种:

  • C++类通过返回类型,传数据给给QML
  • C++通过发送信号,附带参数给QML

以上两种类型,都可以传QList,比如Q_INVOKABLE QVariantList QmlGetAttributeValue(const QString& key); 其中QVariantListQList<QString>类型。
或者通过信号发送附带参数,比如定义一个如下的信号:void linkedDataChanged(QList<QVariant>);
使用QList<QVariant>的话,QVariant里可以放任何你想要的数据结构,一般都是自定义的居多。如果不是自定义的数据,可以直接使用QT的定义类型。可以参考这篇文章:Data Type Conversion Between QML and C++

传LIST链表

QList类型传入到Qml中,被当做了一个JavaScript的数组对待,那么QML可以使用如下方法获取长度,并遍历之:

function onLinkedDataChanged(dictList) {
    console.log("===== len : "+dictList.length)
    for (let i = 0; i < dictList.length; i++) {
        let dict = dictList[i]
        console.log("update: " + dict.update);
        console.log("disable: " + dict.disable);
        console.log("invisible: " + dict.invisible);
    }
}

上述是qml的槽函数,连接了void linkedDataChanged(QList<QVariant>);这个信号,并传入自定义的数据结构。如何给QML传入C++自定义的数据结构可以参考:给QML传递在C++中自定义数据类型(Class)的数据

传MAP键值对

如果想给QML传入键值对,可以使用QMap类型,依然的可以使用QMap<int, QVariant>,给它传入自定义的数据结构。
那么在QML中,QMAP被当做了一个JavaScript的字典对待。可以使用如下方式对其进行遍历:

for (let dict in dictList) {

}

传JSON文件

如下是传入一个JSON数组,数组里多个JSON object。

QJsonDocument jsonDoc;
QJsonArray array;
for (auto e : mp) {
    QJsonObject jsonObject{ {StringUtil::StringToQString(e.first),
                    StringUtil::StringToQString(e.second)} };
    array.append(jsonObject);
    jsonDoc.setObject(jsonObject);
}
jsonDoc.setArray(array);

emit linkedDataChanged(jsonDoc.toJson());

传递自定义的结构体

  • 1、类定义处,增加Q_GADGET的定义
  • 2、定义需要使用的成员Q_PROPERTY
  • 3、使用Q_DECLARE_METATYPE注册好定义的类(这可以让QT的元系统认识这个自定义的结构)
  • 4、写一个接口返回该类型数据,让QML调用
  • 5、QML使用时,拿到返回的该数据,直接通过.来调用具体的Q_PROPERTY所定义的成员(这里使用Q_PROPERTY的第一个参数:名称)

自定义结构体:

class InspectorMaterialInfo
{
    Q_GADGET
    Q_PROPERTY(QString displayName READ GetDisplayName WRITE SetDisplayName)
public:
    InspectorMaterialInfo() = default;
    ~InspectorMaterialInfo() = default;

    const QString &GetDisplayName() const;
    void SetDisplayName(const QString &newDisplayName);

private:
    QString m_displayName;
};
Q_DECLARE_METATYPE(SPEDITOR::InspectorMaterialInfo);

通过提供给QML的接口,将数据返回给QML

QVariant getInfo()
{
    QVariant ret;
    InspectorMaterialInfo info;

    ret.fromValue<InspectorMaterialInfo>(info);
    return ret;
}

QML里的用法

let info = TestInst.getInfo()
if (info != undefined) {
    info.displayName   	// 使用该数据     
}

请添加图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用Qt框架开发应用时,我们可以使用C++与QML进行数据递和界面的刷新。下面我将详细说明如何实现这个过程。 首先,在C++代码中,我们需要定义一个QObject派生的类,用于封装我们需要递的数据。这个类需要使用Q_PROPERTY宏定义相关属性,并提供相应的读写方法。 接下来,在C++代码中,我们需要创建一个QQmlApplicationEngine对象,并加载我们的QML界面文件。然后,使用engine.rootObjects()函数获取根对象,可以将其设置为我们创建的QObject派生类的实例。 在QML文件中,我们可以使用绑定语法将C++中的属性绑定到QML界面上的相应组件。这样,当C++中的属性值发生变化时,QML界面上对应组件的显示也会更新。例如,可以使用bind的方式将C++中的一个整型属性绑定到QML界面上的Text组件的text属性上,即:Text { text: myObject.myProperty }。 当我们需要修改C++中的属性并刷新QML界面时,只需要直接通过对象的属性名称调用相应的写方法即可。例如,在C++代码中我们可以通过myObject.setMyProperty(newValue)的方式修改myProperty的值,然后QML界面上的Text组件就会显示该新值。 总结一下,数据并刷新QML界面的步骤为:定义QObject派生类用于封装数据,创建QQmlApplicationEngine并加载QML界面文件,将根对象设置为QObject派生类的实例,使用绑定语法将C++中的属性绑定到QML界面上的组件,通过调用C++对象的写方法修改属性值并实现界面刷新。这样,我们就可以实现C++与QML之间的数据递和界面刷新了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值