如何保存和恢复 ListModel 的内容?

How to save and restore the content of a ListModel?

我可以保存使用 Component.onComponent 方法静态创建的列表项的设置。但静态创建的列表项的设置会在重新打开应用程序后生效。我想保存动态创建的列表模型的设置。我无法为动态创建的列表项保存设置。下面的代码会在单击 Show/Hide 操作时打开和关闭列表项。当我重新打开应用程序时,创建的列表项消失了。如何使用设置保存列表项?

import QtQuick 2.9
import Fluid.Controls 1.0
import Qt.labs.settings 1.0
import QtQuick.Controls 1.4
ApplicationWindow {
    id:root
    visible: true
    width: 640
    height: 480
    property variant addlist
    property int countt2: 0
    Settings{
        id:mysetting4
        property alias ekranCosinus: root.countt2
    }
    function listonoff(){
        if(countt2%2==1){
            return true
          }
        else if(countt2%2==0){
            return false
        }
    }
    Connections {
        target: addlist

        onTriggered:   listonoff()

    }
    addlist: favourite2
    /* main.qml */
    menuBar: MenuBar {
            Menu {
                title: "&Edit"
                MenuItem { action: favourite2 }
            }
    }
    Action {
        id:favourite2
         text: qsTr("Show/Hide")
         onTriggered: {
            countt2++
            console.log(countt2)
               if(listonoff()===true){
                   return list_model.insert(list_model.index,{ title: "First item."} )
                }
                else if(listonoff()===false){
                   return list_model.remove(list_model.index)
                }
           }
        }
        ListView {
            id:contactlist
            width: parent.width
            height: parent.height
            focus: true
            interactive: true
            clip: true
            model: ListModel {
                id:list_model
            }
            delegate: ListItem {
                text: model.title
                height:60
            }
        }
        MouseArea {
            id: mouse
            anchors.fill: parent
        }
    }

很好奇您期望保存单个整数值能够以某种方式存储任意数据模型的内容...即使对于静态模型数据也不起作用,它只是 "restored" 因为它是静态的 - 它是代码的一部分,您并没有真正保存和恢复任何东西。

如果您想存储所有这些数据,则必须在应用程序退出时对其进行序列化,并在应用程序启动时对其进行反序列化。

您仍然可以使用 Settings,但要存储一个字符串值,它将代表序列化数据。

最简单的方法是使用 JS 数组来回传输模型项,这样可以使用 JS JSON 对象功能轻松序列化和反序列化数据:

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Window 2.3
import Qt.labs.settings 1.0

ApplicationWindow {
  id: main
  width: 640
  height: 480
  visible: true

  property string datastore: ""

  Component.onCompleted: {
    if (datastore) {
      dataModel.clear()
      var datamodel = JSON.parse(datastore)
      for (var i = 0; i < datamodel.length; ++i) dataModel.append(datamodel[i])
    }
  }

  onClosing: {
    var datamodel = []
    for (var i = 0; i < dataModel.count; ++i) datamodel.push(dataModel.get(i))
    datastore = JSON.stringify(datamodel)
  }

  Settings {
    property alias datastore: main.datastore
  }

  ListView {
    id: view
    anchors.fill: parent
    model: ListModel {
      id: dataModel
      ListElement { name: "test1"; value: 1 }
    }
    delegate: Text {
      text: name + " " + value
    }
  }

  MouseArea {
    anchors.fill: parent
    acceptedButtons: Qt.LeftButton | Qt.RightButton
    onClicked: {
      if (mouse.button === Qt.LeftButton) {
        var num = Math.round(Math.random() * 10)
        dataModel.append({ "name": "test" + num, "value": num })
      } else if (dataModel.count) {
        dataModel.remove(0, 1)
      }
    }
  }
}

应用程序从单个数据模型值开始,可以通过分别按鼠标左键和右键来添加或删除更多数据项。

只要应用正常关闭,数据模型就会被复制到数组中,序列化为字符串,存储在Settings元素中。因此,在重新启动应用程序时,如果存在数据字符串,则会清除模型以删除初始值以使其不重复,数据字符串将反序列化回数组,迭代以恢复数据模型的内容。简单易行。

当然,您也可以使用 LocalStorage API,甚至可以通过向 QML 公开 C++ 对象来编写一个简单的文件 reader 和编写器。这种方法所需要的只是能够存储和检索单个字符串。