qt - 其中定义了'index'属性,因为Repeater用于实例化一个项目数组,每个项目都可以访问索引
问题描述
我猜index是一个附加属性,但它是在哪里定义的,为什么访问索引不是这样ListView.isCurrentItem
?
委托暴露给一个只读索引属性,该属性指示转发器中委托的索引。
我更困惑。为什么委托暴露给一个属性,这是通过什么操作发生的?
解决方案
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
必须在之后通过附加的属性公开它们。
推荐阅读
- excel - 如何维护我的 excel 文件的模板?
- jquery - jQuery - 单击外部元素时运行功能
- css - 如何让浏览器立即显示我的代码更改
- excel - 将 SharePoint 上的 Excel 连接为 Tableau 数据源
- xamarin - 如何在 xamarin 表单中的单个标签上使用不同的字体大小
- javascript - Angular:使用片段滚动锚点时出错
- python - 将值映射到单独的列 - 熊猫
- list - Agda: std-lib: List: 检查过滤后的列表是否为空
- arcgis-js-api - 将标头值添加到磁贴请求
- javascript - PHP可以使用JS中设置的条件动态加载文件吗?