我可以保存使用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
}
}
答案 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来编写简单的文件读取器和编写器。所有这些方法都需要能够存储和检索单个字符串。