如何保存和恢复 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 和编写器。这种方法所需要的只是能够存储和检索单个字符串。
我可以保存使用 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 和编写器。这种方法所需要的只是能够存储和检索单个字符串。