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

时间:2018-02-11 09:41:00

标签: qt qml settings

我可以保存使用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
        }
    }

1 个答案:

答案 0 :(得分:4)

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

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

您仍然可以使用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,甚至可以通过将C ++对象暴露给QML来编写简单的文件读取器和编写器。所有这些方法都需要能够存储和检索单个字符串。