首页
学习
活动
专区
圈层
工具
发布

QML _
EN

Stack Overflow用户
提问于 2019-09-06 20:16:43
回答 2查看 488关注 0票数 1

给定一个具有多层存储信息(元素中存储的元素数组)的ListModel,是否有一种方法来存储模型并在以后召回它?

我尝试过将ListModel存储为JSON字符串,但它不跟踪子对象。例如,在下面的片段中,输出告诉我有一个“子”对象,但是不知道"kid1“或"kid2”。“存储”对象也是如此,但不了解"duck1“或"duck2”。

代码语言:javascript
复制
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”。

代码语言:javascript
复制
[
  {
    "kids": {
      "objectName": "",
      "count": 2,
      "dynamicRoles": false
    },
    "name": "Parent"
  },
  {
    "name": "store",
    "ducks": {
      "objectName": "",
      "count": 2,
      "dynamicRoles": false
    }
  }
]

编辑:我希望输出更像这样:

代码语言:javascript
复制
[
  {
    "name": "Parent",
    "kids": [
      {
        "kid": "kid1"
      },
      {
        "kid": "kid2"
      }
    ]
  },
  {
    "name": "store",
    "ducks": [
      {
        "duck": "duck1"
      },
      {
        "duck": "duck2"
      }
    ]
  }
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-06 22:36:51

您似乎希望在应用程序关闭时保存模型的当前状态,并在应用程序再次启动时恢复它。这里一定要有序列化和反序列化模型的能力。

1/2 Qml-仅基于实现

  1. 如果您不介意绑定到第三方许可证(这是完全免费的,代码看起来很可靠,但我还没有尝试或测试它),请使用序列化程序。然后使用JSON.parse从它们的字符串版本重新创建对象。
  2. 创建您自己的(反)序列化程序,并确保它与您正在使用的实际模型紧密关闭。例如,如果模型中的对象中的所有属性都不需要备份/还原,那么直接查找所需的属性并只使用它们可能更明智。这可能大大降低通过属性层次结构进行搜索的开销,但您将获得一个非常特定的(反)序列化程序,它不能跨项目重用。

2/2 Qml/C++实现

如果时间允许,另一种解决方案是在C++端设计模型,并将其按原样或以QVariant的形式公开给Qml代码。然后(反序列化)将委托给C++代码。优点是:代码更干净,I/O操作更快。缺点是:它需要更多的时间来实现,而且在我看来,如果整个应用程序不需要特性的话,它就会变得不必要的复杂。

票数 2
EN

Stack Overflow用户

发布于 2019-09-09 14:47:43

借助misterFad的链接,我创建了一个针对我的应用程序的序列化()函数。发布代码会在其他人身上激发直觉,可能会困在这个问题上。

代码语言:javascript
复制
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是:

代码语言:javascript
复制
[
  {
    "name": "dad",
    "kids": [
      {
        "name": "kid1"
      },
      {
        "name": "kid2",
        "kids": [
          {
            "name": "grandkid1"
          },
          {
            "name": "grandkid2"
          }
        ]
      }
    ]
  },
  {
    "name": "store",
    "kids": [
      {
        "name": "duck1"
      },
      {
        "name": "duck2"
      }
    ]
  }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57828106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档