QML:如何在列表视图中保存委托的状态

时间:2017-09-21 09:59:39

标签: listview delegates qml states

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

listView

我为按钮定义了状态,应该通过我的delegate: ProgramButton { state: stateFromModel } 属性设置。这最初工作,但如果按钮通过滚动退出视图,后来我向后滚动状态似乎已被遗忘。

问题是,正如Qt文档所说,the states should never be saved in delegates

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

1 个答案:

答案 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