Repeater类型用于创建大量的类似项目。像其他视图类型一样,Repeater有一个模型和一个委托:对于模型中的每个条目,委托被实例化在一个用模型中的数据播种的环境中。重复器项目通常被包围在一个定位器类型中,如行或列,以直观地定位由重复器创建的多个委托项目。
下面的重复器在一个行中创建了三个矩形项的实例:
- import QtQuick 2.0
-
- Row {
- Repeater {
- model: 3
- Rectangle {
- width: 100; height: 40
- border.width: 1
- color: "yellow"
- }
- }
- }

重复器的模型可以是任何支持的数据模型。此外,像其他视图的委托一样,重复器的委托可以访问它在重复器中的索引,以及与委托相关的模型数据。详情请参见委托属性文档。
重复器实例化的项目按顺序插入,作为重复器父节点的子节点。插入工作紧随重复器在其父级堆叠列表中的位置之后开始。这使得重复器可以在布局内使用。例如,以下重复器的项目被堆叠在一个红色矩形和一个蓝色矩形之间。
- Row {
- Rectangle { width: 10; height: 20; color: "red" }
- Repeater {
- model: 10
- Rectangle { width: 20; height: 20; radius: 10; color: "green" }
- }
- Rectangle { width: 10; height: 20; color: "blue" }
- }
![]()
注意:一个重复器项目拥有它实例化的所有项目。删除或动态销毁一个由重复器创建的项目会导致不可预测的行为。
重复器类型在首次创建重复器时创建了所有的委托项目。如果有大量的委托项目,并且不是所有的项目都需要同时可见,那么这可能是低效的。如果是这种情况,可以考虑使用其他视图类型,比如ListView(它只在滚动进入视图时创建委托项目),或者使用动态对象创建方法,在需要时创建项目。
另外,请注意Repeater是基于Item的,只能重复项目派生的对象。例如,它不能被用来重复QtObjects:
- //bad code
- Item {
- Can't repeat QtObject as it doesn't derive from Item.
- Repeater {
- model: 10
- QtObject {}
- }
- }
count : int
此属性持有模型中的项目数。
注意:如果重复器在实例化委托的过程中或设置不正确,由count报告的模型中的项目数可能与创建的委托数不同。
[default] delegate : Component
委托提供一个模板,定义重复器实例化的每个项目。
委托被暴露在一个只读的索引属性中,该属性指示重复器中委托的索引。例如,下面的文本委托显示每个重复项目的索引:

如果模型是一个字符串列表或对象列表,该委托也被暴露给一个只读的modelData属性,该属性持有字符串或对象数据。比如说:

如果模型是一个模型对象(如ListModel),委托人可以以命名属性的方式访问所有的模型角色,就像委托人对ListView等视图类的访问一样。
参见QML数据模型。
model : any
为重复器提供数据的模型。
这个属性可以被设置为任何一个支持的数据模型:
- A number that indicates the number of delegates to be created by the repeater
- A model (e.g. a ListModel item, or a QAbstractItemModel subclass)
- A string list
- An object list
模型的类型会影响到暴露给委托的属性。
参见数据模型。
itemAdded(int index, Item item)
当一个项目被添加到重复器中时,这个信号就会被发射出来。index参数表示项目在重复器中被插入的索引,item参数表示被添加的项目。
相应的处理程序是onItemAdded。
itemRemoved(int index, Item item)
当一个项目从重复器中被移除时,这个信号就会被发出。index参数持有项目从重复器中删除的索引,item参数持有被删除的项目。
如果item是由该重复器创建的,则不要保留对item的引用,因为在这些情况下,在信号被处理后不久,它就会被删除。
相应的处理程序是onItemRemoved。
Item itemAt(index)
返回在给定索引处创建的项目,如果索引处不存在项目,则返回空。