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

Edi*_*met 3 settings qt qml

我能够保存使用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
        }
    }
Run Code Online (Sandbox Code Playgroud)

dte*_*ech 11

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

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

您仍然可以使用Settings, 但要存储表示序列化数据的字符串值。

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

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)
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

当然,您也可以使用LocalStorageAPI,甚至通过将 C++ 对象暴露给 QML 来编写一个简单的文件读取器和写入器。这种方法所需要的只是能够存储和检索单个字符串。