gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:17:28 24 4
gpt4 key购买 nike

我可以保存使用 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存储。元素。因此,在重新启动应用程序时,如果数据字符串存在,模型将被清除以删除初始值使其不会重复,数据字符串被反序列化回一个数组,该数组被迭代以恢复数据模型的内容。十分简单。

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

关于qt - 如何保存和恢复 ListModel 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com