我有userdata
个按钮。按钮定义位于其自己的qml文件中,并用作委托。
listView
我为按钮定义了状态,应该通过我的delegate: ProgramButton {
state: stateFromModel
}
属性设置。这最初工作,但如果按钮通过滚动退出视图,后来我向后滚动状态似乎已被遗忘。
问题是,正如Qt文档所说,the states should never be saved in delegates。
但是,通过listModel
属性设置按钮状态的正确方法是什么?
答案 0 :(得分:0)
关于这一点,文档是正确的。至少在那些只实例化那些可见的代表的视图时。
所以解决方案很明显:不要将它存储在代理中 - 但是你可以在哪里存储它?
如果您不想保留模型中的初始状态,则模型将是最简单的位置。在这种情况下,您需要监听stateChange-signals并将新状态写回模型
或者 - 甚至更好 - 直接在模型中更改状态。由于state -> model.stateFromModel
的绑定,它会自动将更改应用于按钮。
如果无法做到这一点,则需要创建持久对象来存储状态。这可以是JSObject
(又名var:({})aka Map),也可以为QObject
和商店的每个条目实例Instantiator
ListView
根据{{1}}使用QObject
检索相应对象的数据。
我自发地想到的最后一种方式是使用myInstantiator.objectAt(index)
这样的:{/ p>
DelegateModel
在那里你将stateChange上的委托添加到一个特殊的组persistedItems
,以防止它们在离开视图时被销毁。
最后,您使用DelegateModel {
id: dm
model: myOriginalModel
delegate: ProgrammButton {
state: stateFromModel
onStateChanged: DelegateModel.inPersistedItems = 1
}
}
作为DelegateModel
的模型,并且不要在那里设置ListView
。