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
的模型,而不在那里设置委托