【问题标题】:QML: How to save states for delegate in a listviewQML:如何在列表视图中保存委托的状态
【发布时间】:2017-09-21 09:59:38
【问题描述】:
我有一个listView 的按钮。按钮定义位于其自己的 qml 文件中并用作委托。
delegate: ProgramButton {
state: stateFromModel
}
我为按钮定义了状态,应该通过我的listModel 的属性进行设置。这最初是有效的,但如果按钮通过滚动消失,然后我向后滚动,状态似乎已被遗忘。
问题是,正如 Qt 文档所说,the states should never be saved in delegates。
但是,通过listView 属性设置按钮状态的正确方法是什么?
【问题讨论】:
标签:
listview
delegates
qml
states
【解决方案1】:
文档在这一点上是正确的。至少对于那些仅实例化那些可见的委托的视图而言。
所以解决方案很明显:不要将它存储在委托中 - 但是你可以将它存储在哪里?
如果您不想在模型中保留初始状态,模型将是最简单的地方。在这种情况下,您需要监听 stateChange-signals 并将新状态写回模型。
或者 - 甚至更好 - 直接在 model 中更改状态。由于state -> model.stateFromModel 的绑定,它会自动将更改应用到按钮。
如果这不可能,您需要创建持久对象来存储状态。这可以是 JSObject(又名 var: ({}) aka Map),或者您可以为 ListView 的每个条目使用 Instantiator 实例化 QObject,并将数据存储在相应的 QObject 中使用myInstantiator.objectAt(index)检索对应的对象。
我想到的最后一个方法是像这样使用DelegateModel:
DelegateModel {
id: dm
model: myOriginalModel
delegate: ProgrammButton {
state: stateFromModel
onStateChanged: DelegateModel.inPersistedItems = 1
}
}
您可以在 stateChange 时将委托添加到特殊组 persistedItems,以防止它们在离开视图时被销毁。
最后你使用DelegateModel 作为ListView 的模型并且不要在那里设置delegate。