首页 > 解决方案 > 其中定义了'index'属性,因为Repeater用于实例化一个项目数组,每个项目都可以访问索引

问题描述

我猜index是一个附加属性,但它是在哪里定义的,为什么访问索引不是这样ListView.isCurrentItem

从官方文档中,Repeater的委托属性描述

委托暴露给一个只读索引属性,该属性指示转发器中委托的索引。

我更困惑。为什么委托暴露给一个属性,这是通过什么操作发生的?

标签: qtqmlqt5qtquick2qt-quick

解决方案


index不是附加属性,而是上下文属性。

由于Repeater正在实例化委托本身,因此它可以在这样做时提供自定义上下文。

在这种情况下,您拥有index模型的每个角色的属性(或者modelData如果它是没有角色的模型)和model包含所有先前提到的属性的对象属性。该model对象可以使用更合格的名称访问其他属性,以避免阴影。例如,如果你的源模型有一个text角色,而你的委托有一个text属性,那么做text: text就不会走得太远。要解决此问题,您可以这样做text: model.text

总而言之,您的委托可以访问这些上下文属性:

对于没有角色的模型(QStringList, QObjectList, JS 数组, 整数, ...):

  • index
  • modelData
  • model
    • .index
    • .modelData

对于具有角色的模型(a c++ QAbstractListModel, ListModel, ...):

  • index
  • role1
  • role2
  • ...
  • model
    • .index
    • .role1
    • .role2
    • ...

为什么ListView使用附加属性(例如ListView.isCurrentItem而不是上下文属性)是因为ListView不直接实例化其委托。它在QQmlDelegateModel内部使用(Repeater也使用它)。它QQmlDelegateModel公开了索引和角色上下文属性,但它不知道ListView特定的属性,因此ListView必须在之后通过附加的属性公开它们。


推荐阅读