2016-12-14 1 views
0

Es gibt ein Beispiel: http://doc.qt.io/qt-5/qtdatavisualization-qmlscatter-example.html der Verwendung von Qml und QtQuick, um eine 3D-Scatter zu erstellen.Chage ListModel-Daten in QML-Datei mit C++

Wie kann ich ListModel-Daten in Data.qml-Datei mit C++ - Code change (löschen, anhängen, löschen)?

Data.qml

import QtQuick 2.1 

Item { 
    property alias model: dataModel 
    property alias modelTwo: dataModelTwo 
    property alias modelThree: dataModelThree 

    ListModel { 
     id: dataModel 
     ListElement{ xPos: -10.0; yPos: 5.0; zPos: -5.0 } 
     ListElement{ xPos: -9.0; yPos: 3.0; zPos: -4.5 } 
     ListElement{ xPos: -8.5; yPos: 4.1; zPos: -4.0 } 
     ... 
    } 
    ... 
} 
+0

Siehe: http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html Werfen Sie einen besonderen Blick auf den Abschnitt: ** warning **. Dann möchten Sie vielleicht ein Modell in C++ erstellen und es als ContextProperty für QML verfügbar machen und dort verwenden. http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html – derM

Antwort

2

Wenn Sie das Modell von C++ ändern möchten, können Sie ein Objekt registrieren, die QAbstractItemModel zum QML Laufzeit implementiert.

QAbstraactItemModel ist eine ziemlich komplexe Klasse, es gibt hilfreiche abgeleitete Typen, die die Implementierung erleichtern können, aber das hängt von Ihrem Anwendungsfall ab. Zum Beispiel ist QAbstractListModel nützlich für Listen, im Gegensatz zu Tabellen, und QStandardItemModel ist nützlich für Daten, die leicht modelliert werden können bei QStandardItems.

Sobald Sie das Modell in C++ implementiert haben, müssen Sie es für die QML-Laufzeit verfügbar machen. Dies geschieht unter Verwendung von setContextProperty unter QQmlContext. Im Allgemeinen ist die QQmlContext, die Sie wünschen, die rootContext() Ihrer QQmlEngine.

Die Registrierung könnte wie folgt aussehen:

int main(int argc, char **argv) { 
    QGuiApplication app(argc, argv); 
    QQmlApplicationEngine engine; 
    MyListModel *model = new MyListModel; 

    engine.rootContext()->setContextProperty("myListModel", model); 
    engine.load(":/myqmlapp.qml"); 
    app.exec(); 
    [...] 
} 

das Modell den Zugriff von innen QML verwenden Sie den Namen, mit dem es in diesem Fall registriert wurde myListModel: diese

import QtQuick 2.7 

Item { 
    ListView { 
     model: myListModel 
    } 
}