我希望有一个类似ListModel
的结构来显示简单状态机的输入。每个输入可能包含多个字符串/整数。所以我需要ListModel
的每个项目能够存储数据列表(包含输入参数名称的字符串,或带字符串的字典等)。目前,我无法将带有列表属性的项目附加到ListModel
。
所以ListModel
看起来像这样:
ListView {
anchors.fill: parent
model: ListModel {
id: listModel
}
delegate: Text {
text: inputs[0]['name']
}
}
当状态发生变化时,我想更新模型并追加这样的元素:
var state = {
name: "abcd",
inputs: [{name: 'a'}, {name: 'b'}, {name: 'c'}]
}
listModel.append(state);
当前版本的代码返回错误TypeError: Cannot read property 'name' of undefined
。它没有看清单。
根据this question,在ListModel
的项目中使用列表可能会出现问题。但这似乎与我的情况无关。也许我需要在QML中使用不同的列表和词组,也许我必须在委托(我试过)或其他东西(建议?)中写text: inputs[0].name
。
有人可以建议如何在ListModel
中制作一个或多或少复杂的项目(基本上是标准的JSON)吗?目前尚不清楚,因为文档和博客/问题始终处理字符串。我错过了一些有用的文档吗?在QML中做什么是好的做法?我应该使用一些自定义对象吗?
答案 0 :(得分:2)
根据documentation和您在命令式代码中正确执行的操作,可以将列表数据添加到ListElement
。但是,嵌套角色不是真正的数组。他们自己ListModel
。那是因为,by design,如果数组元素发生变化,QML不会产生通知,这将是模型视图委托设置中的show-stopper。
由于嵌套角色是模型,因此您可以使用模型的函数。例如,这个例子工作正常:
import QtQuick 2.5
import QtQuick.Window 2.2
Window {
id: window
width: 600
height: 400
visible: true
ListView {
anchors.fill: parent
model: ListModel {
id: listModel
}
delegate: Text {
text: name + inputs.get(index % inputs.count).name // accessing the inner model
}
}
MouseArea {
anchors.fill: parent
onClicked: {
var state = {
name: "abcd",
inputs: [{name: 'a'}, {name: 'b'}, {name: 'c'}]
}
listModel.append(state);
}
}
}
根据您的问题,输入是纯JSON。在这种情况下,请考虑使用JSONListModel
代替ListModel
。它通过JSONPath公开了一组匹配XMLListModel
的API,并且可能代表您的场景的完美解决方案。