其中定义了 'index' 属性,因为 Repeater 用于实例化项目数组,每个项目都可以访问索引

Cra*_*l.W 3 qt qml qt-quick qt5 qtquick2

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

从官方文档来看, Repeater 的delegate属性的描述

委托会暴露给只读索引属性,该属性指示中继器内委托的索引。

我更困惑了。为什么委托会暴露给某个属性?通过什么操作会发生这种情况?

Gre*_*cKo 6

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

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

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

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

对于没有角色的模型(QStringListQObjectList、JS 数组、整数……):

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

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

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

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