【问题标题】: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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多