使用 C++ 更改 qml 文件中的 ListModel 数据
Chage ListModel data in qml file using C++
有一个示例:http://doc.qt.io/qt-5/qtdatavisualization-qmlscatter-example.html 使用 qml 和 QtQuick 创建 3D 散点图。
如何使用 C++ 代码更改(删除、追加、清除)Data.qml 文件中的 ListModel 数据?
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 }
...
}
...
}
如果要从 C++ 修改模型,可以将实现 QAbstractItemModel
的对象注册到 QML 运行时。
QAbstraactItemModel
是一个相当复杂的 class,有一些有用的派生类型可以使实现更容易,但这取决于您的用例。例如,QAbstractListModel
适用于列表,而不是表格,QStandardItemModel
适用于可以轻松建模为 QStandardItems
的数据。
用 C++ 实现模型后,您需要使其可用于 QML 运行时。这是在 QQmlContext
上使用 setContextProperty
完成的。一般来说你想要的QQmlContext
就是你的QQmlEngine
.
的rootContext()
注册可能看起来像这样:
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
}
}
有一个示例:http://doc.qt.io/qt-5/qtdatavisualization-qmlscatter-example.html 使用 qml 和 QtQuick 创建 3D 散点图。
如何使用 C++ 代码更改(删除、追加、清除)Data.qml 文件中的 ListModel 数据?
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 }
...
}
...
}
如果要从 C++ 修改模型,可以将实现 QAbstractItemModel
的对象注册到 QML 运行时。
QAbstraactItemModel
是一个相当复杂的 class,有一些有用的派生类型可以使实现更容易,但这取决于您的用例。例如,QAbstractListModel
适用于列表,而不是表格,QStandardItemModel
适用于可以轻松建模为 QStandardItems
的数据。
用 C++ 实现模型后,您需要使其可用于 QML 运行时。这是在 QQmlContext
上使用 setContextProperty
完成的。一般来说你想要的QQmlContext
就是你的QQmlEngine
.
rootContext()
注册可能看起来像这样:
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
}
}