在 qml 如何保存作为列表视图元素的标签文本
Posted
技术标签:
【中文标题】在 qml 如何保存作为列表视图元素的标签文本【英文标题】:in qml how to save a label text which is element of a list view 【发布时间】:2021-10-08 18:55:26 【问题描述】:我已经在 qml 中做了一个应用程序。在代码中有一个ListView
(id:daylistView)。
在ListView
中有一个Label
作为它的一个元素(id:notesLabel):
ListView
id:daylistView
orientation: Qt.Vertical
model:hourlistModel
delegate:Item
id:hourItem
property string hourTime:hourweeklistviewLabel
property string notetaking:notesLabe
.............
MouseArea
anchors.fill:parent
onClicked:
windowLoader.active =true
daylistView.currentIndex=index
Rectangle
Label
id:hourweeklistviewLabel
Label
id:notesLabel
anchors.left:hourweeklistviewLabel.right
anchors.leftMargin: 30
text:""
//Label
//delegate:Item
//ListView
Label
的文本是TextField
(id:title) 中的输入:
Loader
id:windowLoader
focus: true
active:false
sourceComponent: Window
id:inputWin
title:"Enter Note"
width:500
height:300
visible:true
onClosing:
windowLoader.active=false
monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentIndex = calendarMonth.selectedDate.getDate() === new Date().getDate()
&& calendarMonth.selectedDate.getDay() === new Date().getDay()
&& calendarMonth.selectedDate.getMonth() === new Date().getMonth()?getHour():12
TextField
id:title
x:50
y:20
placeholderText :'Enter Note'
text:monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentItem.notetaking.text
TextField
id:timeDate
anchors.horizontalCenter: title.horizontalCenter
anchors.top:title.bottom
anchors.topMargin:10
placeholderText : calendarMonth.selectedDate.getDate() +"-"
+ (calendarMonth.selectedDate.getMonth()+1)+"-"
+ calendarMonth.selectedDate.getFullYear() + " "
+ monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentItem.hourTime.text
Button
id: button
text: qsTr("Add Note")
anchors.centerIn:parent
onClicked:
if (title.text !=="")monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentItem.notetaking.text= title.text
else
当我按下“添加注释”按钮时,输入文本设置为notesLabel.text
。
ListModel
的 ListView
是:
ListModel
id:hourlistModel
Component.onCompleted:
for (var i = 0; i <25; i++)
append(createListElement())
property int h:0
function createListElement()
return
hour : h++
我的问题是,当我关闭并重新打开应用程序时,如何保存 notesLabel.text
并在纯 Qml 中恢复它。
【问题讨论】:
您需要保存模型数据,因此模型不仅仅是model:24
,而是您从文件中读取并保存到文件的一些数据数组。考虑一下***.com/questions/19244672/…,请注意不要包含可以是本地文件的 Web 引用的 URI。
【参考方案1】:
您提供了许多似乎与您的问题无关的额外代码/信息。您要问的是如何在关闭/重新打开应用程序时保存/恢复数据。为此,最简单的解决方案是使用 QML 的 Settings 类型。以下是它的外观示例(我尚未对此进行测试):
Window
id: window
property string notesText: daylistView.currentItem.notesLabel.text
ListView
id: daylistView
...
Settings
property alias notesText: window.notesText
更新:
您不应该真正尝试访问列表中的委托项目,而是访问模型数据。看起来您正在尝试直接从弹出窗口中的 TextField 填充列表中的标签。这是一个非常糟糕的方法。 ListViews 可以在您滚动时删除/重用委托项目,如果您没有将数据存储在委托之外的某个位置,则数据可能会丢失。在 TextField 中输入的文本应写入您的模型而不是标签。然后标签应该使用绑定到模型中来显示更新的文本。
如果您正确使用模型,嵌套列表的问题也会消失。无论 ListView 在做什么,数据都应该始终存在,因此您不应遇到 null。然后Settings
对象也应该指向模型数据而不是视图。
property var myModel: [
someNumber: 1,
subModel: [
someString: "Hello" ,
someString: "World"
]
,
someNumber: 2,
subModel: [
someString: "ABC" ,
someString: "123"
]
]
ListView
id: outerList
model: myModel
delegate: ListView
id: innerList
model: myModel[index].subModel
delegate: Label
text: innerList.model[index].someString
要更新模型中的文本,它可能如下所示:
myModel[<index of outerList>].subModel[<index of innerList>].someString = "some new text"
【讨论】:
@JarManOK 如果 ListView 是嵌套的(还有其他 2 个 ListViews ),我如何表达 notesText 属性而不会出现“无法读取 null 属性”错误? 见我上面的编辑。 @JarMan我对我的列表模型做了一些更改,我想问你是否可以更彻底地更新模型中的文本。我可以使用myModel.currentIndex.subModel.currentIndex.someString= title.text
吗?
不,更像这样:myModel[outerList.currentIndex].subModel[innerList.currentIndex].someString = title.text
类似的,是的。虽然,我认为您不能在一个对象中拥有多个具有相同名称的项目。 day:0;day:1;day:2
以上是关于在 qml 如何保存作为列表视图元素的标签文本的主要内容,如果未能解决你的问题,请参考以下文章