如何保存和还原列表模型的内容



我能够为使用Component.onComponent方法静态创建的列表项目保存设置。但是,重新开放应用程序后,静态创建的列表项目的设置会影响。我想为动态创建的列表模型保存设置。我无法为动态创建的列表项目保存设置。下面的代码确实在单击"显示/隐藏"操作时列表项目打开和关闭。当我重新打开应用程序时,创建的列表项目消失了。如何使用设置保存列表项目?

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
        }
    }

非常好奇您期望保存单个整数值以某种方式存储任意数据模型的内容...即使对于静态模型数据,它只是"还原" ,因为它是静态 - 它是代码的一部分,您并没有真正保存和还原任何内容。

如果要存储所有这些数据,则必须在应用程序启动时将其序列化,并在应用程序启动时进行序列化。

您仍然可以使用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元素存储。因此,在重新启动应用程序后,如果存在数据字符串,则清除模型以删除初始值,以免重复,将数据字符串重新序列化回一个数组,该数组迭代以恢复数据模型的内容。轻松的peasy。

当然,您也可以使用LocalStorage API,甚至可以通过将C 对象公开QML来编写简单的文件读取器和作者。所有这些方法都需要存储和检索一个字符串。

最新更新