You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绑定Repeater生成的子项属性并在Repeater外部使用?

问题原因

你遇到的报错本质是Repeater创建委托子项是异步过程:你在外部定义的Binding会在组件初始化阶段就执行,此时Repeater还没完成所有委托的实例化,foo.itemAt(0)/foo.itemAt(1)返回null,读取x属性自然触发类型错误。
而委托内部的绑定不会报错,是因为绑定执行时当前委托已经完成实例化,itemAt(index)指向自身,必然不为空。


修复方案

方案1:添加空值防护(最简单)

直接在绑定表达式中判断子项是否存在,为空时返回兜底值即可,Qt 5.15及以上版本可以直接用可选调用+空值合并运算符简化写法:

Binding {
    target: moo
    property: "text"
    value: (foo.itemAt(0)?.x ?? 0) + " -> " + (foo.itemAt(1)?.x ?? 0)
}

低版本Qt可以用三目运算符实现同样效果:

value: (foo.itemAt(0) ? foo.itemAt(0).x : 0) + " -> " + (foo.itemAt(1) ? foo.itemAt(1).x : 0)

等Repeater完成委托创建后,绑定会自动触发更新,显示正确的坐标值。

方案2:同步坐标到数据源(更稳定,推荐)

你当前拖拽修改的是委托Rectangle的x/y属性,没有同步回底层的ListModel,本身就存在数据和视图不一致的问题。可以直接把视图坐标同步到Model,外部直接绑定Model的属性,完全规避访问Repeater子项的空值问题:
首先在委托的Rectangle中添加坐标同步逻辑:

Rectangle {
    x: model.x; y: model.y
    // 新增:视图坐标变化时同步回Model
    onXChanged: model.x = x
    onYChanged: model.y = y
    // 其余原有代码不变...
}

然后外部的Text直接绑定Model属性即可,不需要额外的Binding:

Text {
    id: moo
    text: modelNodes.get(0).x + " -> " + modelNodes.get(1).x
}

这个方案的优势是完全依赖数据源做状态同步,不受Repeater渲染生命周期影响,即使后续动态增删Model元素,也不会出现空值报错。


内容的提问来源于stack exchange,提问作者scopchanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:27:00