我是一名编写 QtQuick 应用程序的 JS 开发人员,我已经尝试过多种解决方案。
在 QML 中用 JavaScript 管理模型的简短答案是这是一场噩梦。我建议您编写 QAbstractListModel 的一个小子类,它在内部使用QJsonArray http://qt-project.org/doc/qt-5/qjsonarray.html作为其数据源,这样可以更轻松地理解 C++ 中的数据结构及其在 QML 中的用法。按照说明从 C++ 创建 QML 类型here http://qt-project.org/doc/qt-5/qtqml-cppintegration-definetypes.html.
如果您仍然想在 JavaScript 中执行此操作,另一种方法如下:
function createNewList() {
var newListModel = Qt.createQmlObject('import QtQuick 2.2; \
ListModel {}', parent);
return newListModel;
}
然而,即使在使用后,这也存在一些严重的内存泄漏问题gc()
如果您主要关心的是在 ListModels 中包含 ListModels,那么以下简单的事情对我有用(我认为 ListModels 中的对象数组和 ListModels 之间存在隐式类型转换)
property ListModel items: ListModel {}
function addComplexItem() {
items.append({
"key": "People",
"arr": [
{
"arrItemName": "John",
"arrItemValue": 18,
},
{
"arrItemName": "Kerry",
"arrItemValue": 21,
},
{
"arrItemName": "Mike",
"arrItemValue": 19,
}
]});
}
// Usage
Component {
id: viewDelegate
Item {
Text {
text: "List of " + key
}
ListView {
model: arr
delegate: Rectangle {
Text {
text: arrItemName
}
}
}
}
}