其中定义了'index' 属性,因为Repeater是用来实例化一个item数组的,每个item都可以访问index

Where 'index' property is defined, as Repeater is used to instantiate an array of items, each them can access the index

我猜 index 是附加的 属性,但它在哪里定义以及为什么访问 index 不是ListView.isCurrentItem?

来自官方文档,description of delegate property of Repeater

Delegates are exposed to a read-only index property that indicates the index of the delegate within the repeater.

我更糊涂了。为什么委托会暴露给 属性,这是通过什么操作发生的?

index 属性 是一个普通的 属性 ,可以在委托中使用,每次重复委托时都会不同(RepeaterListView 以及更多)

考虑到这一点,您可以做一些方便的事情,例如突出显示当前项目:

ListView {
    id: list
    model: 5 //instantiate the delegate 5 times

    delegate: Button {
        highlighted: list.currentIndex == index

        onClicked: list.currentIndex = index
    }
}

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

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

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

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

对于没有角色的模型(QStringListQObjectList,一个 JS 数组,一个整数,...):

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

对于具有角色的模型(c++ QAbstractListModelListModel、...):

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

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