QML:如何在listview中保存委托的状态

QML:如何在listview中保存委托的状态,listview,delegates,qml,states,Listview,Delegates,Qml,States,我有一个列表视图。按钮定义位于其自己的qml文件中,并用作委托 delegate: ProgramButton { state: stateFromModel } 我为按钮定义了状态,这些状态应该通过我的listModel属性设置。这在一开始是有效的,但是如果按钮通过滚动消失在视野之外,然后我向后滚动,那么状态似乎已经被忘记了 问题是,正如Qt文档所说 但是,通过列表视图属性设置按钮状态的正确方法是什么?文档在这一点上是正确的。至少对于那些仅实例化可见委托的视图而言 因此,解决方案是

我有一个
列表视图
。按钮定义位于其自己的qml文件中,并用作委托

delegate: ProgramButton { 
    state: stateFromModel
}
我为按钮定义了状态,这些状态应该通过我的
listModel
属性设置。这在一开始是有效的,但是如果按钮通过滚动消失在视野之外,然后我向后滚动,那么状态似乎已经被忘记了

问题是,正如Qt文档所说


但是,通过
列表视图
属性设置按钮状态的正确方法是什么?

文档在这一点上是正确的。至少对于那些仅实例化可见委托的视图而言

因此,解决方案是显而易见的:不要将其存储在代理中,但您可以将其存储在哪里

如果您不想在模型中保留初始状态,那么模型将是最简单的地方。在这种情况下,您需要监听stateChange信号并将新状态写回模型。
或者——甚至更好——直接在模型中更改状态。由于绑定了
state->model.stateFromModel
,它将自动将更改应用于按钮

如果不可能,则需要创建持久对象来存储状态。这可以是
JSObject
(aka var:({})aka Map),也可以使用
实例化器
列表视图的每个条目实例化
QObject
,并使用
myInstantiator.objectAt(index)
将数据存储在相应的
QObject
中以检索相应的对象

我想到的最后一种方法是使用
DelegateModel
,如下所示:

DelegateModel {
    id: dm
    model: myOriginalModel
    delegate: ProgrammButton {
        state: stateFromModel
        onStateChanged: DelegateModel.inPersistedItems = 1
    }
}
在这里,您将stateChange时的委托添加到一个特殊组中,以防止它们在离开视图时被销毁

最后,使用
DelegateModel
作为
ListView
的模型,而不在那里设置
委托