其中定义了'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
属性 是一个普通的 属性 ,可以在委托中使用,每次重复委托时都会不同(Repeater
, ListView
以及更多)
考虑到这一点,您可以做一些方便的事情,例如突出显示当前项目:
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
.
总而言之,您的委托可以访问这些上下文属性:
对于没有角色的模型(QStringList
,QObjectList
,一个 JS 数组,一个整数,...):
index
modelData
model
.index
.modelData
对于具有角色的模型(c++ QAbstractListModel
、ListModel
、...):
index
role1
role2
- ...
model
.index
.role1
.role2
- ...
为什么 ListView
使用附加属性(例如 ListView.isCurrentItem
而不是上下文属性)是因为 ListView
不直接实例化其委托。它在内部使用 QQmlDelegateModel
(Repeater
也使用它)。公开索引和角色上下文属性的是 QQmlDelegateModel
,但它不知道 ListView
特定属性,因此 ListView
之后必须通过附加属性公开它们。
我猜 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
属性 是一个普通的 属性 ,可以在委托中使用,每次重复委托时都会不同(Repeater
, ListView
以及更多)
考虑到这一点,您可以做一些方便的事情,例如突出显示当前项目:
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
.
总而言之,您的委托可以访问这些上下文属性:
对于没有角色的模型(QStringList
,QObjectList
,一个 JS 数组,一个整数,...):
index
modelData
model
.index
.modelData
对于具有角色的模型(c++ QAbstractListModel
、ListModel
、...):
index
role1
role2
- ...
model
.index
.role1
.role2
- ...
为什么 ListView
使用附加属性(例如 ListView.isCurrentItem
而不是上下文属性)是因为 ListView
不直接实例化其委托。它在内部使用 QQmlDelegateModel
(Repeater
也使用它)。公开索引和角色上下文属性的是 QQmlDelegateModel
,但它不知道 ListView
特定属性,因此 ListView
之后必须通过附加属性公开它们。