Chage ListModel данные в файле qml с использованием C++

Вот пример: http://doc.qt.io/qt-5/qtdatavisualization-qmlscatter-example.html использования qml и QtQuick для создания трехмерного рассеяния.

Как я могу изменить (удалить, добавить, очистить) данные ListModel в файле Data.qml, используя код C++?

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 }
         ...
     }
     ...
}

1 ответ

Решение

Если вы хотите изменить модель из C++, вы можете зарегистрировать объект, который реализует QAbstractItemModel в среду выполнения QML.

QAbstraactItemModel это довольно сложный класс, есть полезные производные типы, которые могут упростить реализацию, но это зависит от вашего варианта использования. Например, QAbstractListModel полезен для списков, в отличие от таблиц, и QStandardItemModel полезно для данных, которые могут быть легко смоделированы в QStandardItems,

После того, как вы реализовали модель в C++, вам нужно сделать ее доступной для среды выполнения QML. Это сделано с помощью setContextProperty на QQmlContext, Как правило, QQmlContext ты хочешь это rootContext() вашей QQmlEngine,

Регистрация может выглядеть примерно так:

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

Для доступа к модели из QML вы используете имя, под которым она была зарегистрирована, в данном случае myListModel:

import QtQuick 2.7

Item {
    ListView {
        model: myListModel
    }
}
Другие вопросы по тегам