给定一个具有多层存储信息(元素中存储的元素数组)的ListModel,是否有一种方法来存储模型并在以后召回它?
我尝试过将ListModel存储为JSON字符串,但它不跟踪子对象。例如,在下面的片段中,输出告诉我有一个“子”对象,但是不知道"kid1“或"kid2”。“存储”对象也是如此,但不了解"duck1“或"duck2”。
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
ListModel {
id: listModel
ListElement {
name: "Parent"
kids: [
ListElement {kid: "kid1"},
ListElement {kid: "kid2"}
]
}
ListElement {
name: "store"
ducks: [
ListElement {duck: "duck1"},
ListElement {duck: "duck2"}
]
}
Component.onCompleted: {
var datamodel = []
for (var i = 0; i < this.count; ++i)
datamodel.push(this.get(i))
console.log(JSON.stringify(datamodel))
}
}
}这是输出,它无法显示任何关于子对象的信息。我希望在“父”对象下有"kid1“和"kid2”。
[
{
"kids": {
"objectName": "",
"count": 2,
"dynamicRoles": false
},
"name": "Parent"
},
{
"name": "store",
"ducks": {
"objectName": "",
"count": 2,
"dynamicRoles": false
}
}
]编辑:我希望输出更像这样:
[
{
"name": "Parent",
"kids": [
{
"kid": "kid1"
},
{
"kid": "kid2"
}
]
},
{
"name": "store",
"ducks": [
{
"duck": "duck1"
},
{
"duck": "duck2"
}
]
}
]发布于 2019-09-06 22:36:51
您似乎希望在应用程序关闭时保存模型的当前状态,并在应用程序再次启动时恢复它。这里一定要有序列化和反序列化模型的能力。
1/2 Qml-仅基于实现
JSON.parse从它们的字符串版本重新创建对象。2/2 Qml/C++实现
如果时间允许,另一种解决方案是在C++端设计模型,并将其按原样或以QVariant的形式公开给Qml代码。然后(反序列化)将委托给C++代码。优点是:代码更干净,I/O操作更快。缺点是:它需要更多的时间来实现,而且在我看来,如果整个应用程序不需要特性的话,它就会变得不必要的复杂。
发布于 2019-09-09 14:47:43
借助misterFad的链接,我创建了一个针对我的应用程序的序列化()函数。发布代码会在其他人身上激发直觉,可能会困在这个问题上。
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
function serialize(object) {
var model = object
var totalText = "["
for(var i = 0; i < model.count; i++) {
var element = model.get(i)
totalText += "{\"name\": \"" + element.name + "\""
if(element.kids.count) totalText += ",\"kids\": " + serialize(element.kids)
totalText += "}" + (i < model.count-1 ? ",": "")
}
return totalText + "]"
}
ListModel {
id: listModel
ListElement {
name: "dad"
kids: [
ListElement {
name: "kid1";
kids: []
},
ListElement {
name: "kid2";
kids: [
ListElement {name: "grandkid1"; kids: []},
ListElement {name: "grandkid2"; kids: []}
]
}
]
}
ListElement {
name: "store"
kids: [
ListElement {name: "duck1"; kids: []},
ListElement {name: "duck2"; kids: []}
]
}
Component.onCompleted: console.log(serialize(listModel))
}
}输出JSON是:
[
{
"name": "dad",
"kids": [
{
"name": "kid1"
},
{
"name": "kid2",
"kids": [
{
"name": "grandkid1"
},
{
"name": "grandkid2"
}
]
}
]
},
{
"name": "store",
"kids": [
{
"name": "duck1"
},
{
"name": "duck2"
}
]
}
]https://stackoverflow.com/questions/57828106
复制相似问题