2017-06-11 3 views
0

Ich habe eine Frage im Zusammenhang mit der Leistung. Ich möchte vom C++ - Seitenvektor der Strukturen zur qml-Seite übergehen, wo Vektor ungefähr 3000 Elemente und Strukturelemente enthält. Grundsätzlich kann ich 14 Behälter mit z.B. QVariantLists werden mit Daten gefüllt und rufen 4 Funktionen auf (z. B. QObject :: invokeMethod), um diese Daten weiterzugeben. Ich kann auch QObject :: invokeMethod 3000 mal aufrufen, wo ich nur QVariantList übergebe, also was ist die beste Lösung in diesem Fall?Eine Leistung beim Übergeben von großen Daten von C++ zu QML

  1. Gibt es eine Möglichkeit, von C++ - Seitenstruktur mit 14 Elementen zu qml zu gelangen, indem man sie direkt auf ein qml- oder js-Objekt überträgt?
+0

Sie übergeben die 3000-Elemente-Liste nicht an QML. Sie erstellen ListView in QML und erstellen ein C++ - Datenmodell, für das die ListView abfragen kann, wenn Elemente auf dem Bildschirm angezeigt werden. http://doc.qt.io/qt-5/qtquick-modelviewsdata-cppmodels.html – selbie

Antwort

0

Ich weiß nicht, was ist Ihr Anwendungsfall, aber Sie können auf einmal alle Daten übergeben, als Array von Arrays:

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]); 
      } 
     } 
    } 
} 

Wie für die Leistung, denke ich, dass die Weitergabe Daten in QVariant verpackt ist überhaupt nicht effizient. Stattdessen können Sie ein Proxy-Objekt in C++ erstellen und QML entweder mit setContextProperty oder qmlRegisterType bereitstellen.

Verwandte Themen