将大数据从C ++传递到QML的性能

时间:2017-06-11 06:31:45

标签: c++ qt qml qtquick2

我有一个与表现相关的问题。我想从结构的C ++侧向量传递到qml侧,其中向量包含大约3000个元素和结构14个元素。基本上我可以创建14个容器,例如QVariantLists填充数据并调用4个函数(例如QObject :: invokeMethod)来传递该数据。我也可以调用QObject :: invokeMethod 3000次,我只传递QVariantList,那么在这种情况下最好的解决方案是什么?

  1. 有没有办法从带有14个元素的C ++端结构传递到qml并直接将其转换为某个qml或js对象?

1 个答案:

答案 0 :(得分:0)

我不知道你的用例是什么,但你可以一次传递所有数据,作为数组的数组:

<强> C ++

QVariantList list;
for(int i = 0;i < 10;i ++) {
    QList<int> sublist;
    sublist.append(i * 1);
    sublist.append(i * 2);
    sublist.append(i * 3);
    list.append(QVariant::fromValue(sublist));
}

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));


QObject *root = engine.rootObjects().first();
QMetaObject::invokeMethod(root, "printArrays", Qt::DirectConnection,
                           Q_ARG(QVariant, QVariant::fromValue(list)));

QML (main.qml)

Window {
    width: 200
    height: 200
    visible: true

    function printArrays(arr)
    {
        for (var i = 0; i < arr.length; i++) {
            var subarr = arr[i];
            for (var j = 0; j < subarr.length; j++) {
                console.info(subarr[j]);
            }
        }
    }
}

至于性能,我认为传递QVariant中包含的数据根本没有效率。相反,您可以使用C ++创建一些代理对象,并使用setContextPropertyqmlRegisterType将其公开给QML。