在 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

ListModelListView 是:

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 如何保存作为列表视图元素的标签文本的主要内容,如果未能解决你的问题,请参考以下文章

在 qml 中的列表视图之外的文本字段中设置列表视图中的标签中的文本

如何在表格视图的单元格中使用夏季元素作为标签?

将文本表的数据导出为 .csv (Tableau)

当键盘出现时,白框会遮挡视图

新增表单元素

Tableau - YTD,MTD 作为文本表中的列