Qt Creator 4.6(Linux)下QML Positioner属性无法关联模型委托问题
解决Qt Positioner示例中点击方块索引始终为-1的问题
这个问题我之前也碰到过,核心原因是你混淆了Positioner的附加属性和自定义属性的区别,咱们一步步理清楚:
问题根源
Qt的Positioner组件(比如Row、Column、Grid这些布局容器)会自动给每个子元素注入一个附加属性Pos.index,这个属性由Positioner内部维护,会实时反映子项在布局中的位置索引。
你注释掉的TEXT1应该是直接使用了这个官方提供的附加属性,所以能正确输出索引;而你取消注释的TEXT2,应该是自己定义了一个普通的index属性,但没有把它和Positioner维护的索引关联起来——int类型的属性默认值是-1,所以点击所有方块都会输出-1。
两种正确的解决方式
方式1:直接使用Positioner的附加属性(推荐)
这是Qt官方设计的标准用法,简单可靠,不需要额外绑定:
Rectangle { // TEXT1 保留这个写法就没问题 MouseArea { anchors.fill: parent onClicked: console.log(Pos.index) } }
方式2:绑定自定义index属性到附加属性
如果你确实需要自己定义index属性(比如要在其他地方复用这个值),只要把它明确绑定到Pos.index就行:
Rectangle { // TEXT2 修改成这样,就能正确获取索引了 property int index: Pos.index MouseArea { anchors.fill: parent onClicked: console.log(index) } }
额外补充:如果用Repeater生成子项
如果你的方块是通过Repeater生成的,还可以直接用Repeater提供的model.index属性,效果是一样的:
Repeater { model: 5 // 假设生成5个方块 Rectangle { property int index: model.index MouseArea { anchors.fill: parent onClicked: console.log(index) } } }
总结一下:Positioner的子项索引不能随便自定义一个属性就用,要么直接用官方的Pos.index附加属性,要么把自定义属性绑定到它上面,这样才能保证索引值是实时正确的。
内容的提问来源于stack exchange,提问作者mock_blatt
相关产品推荐
相关产品推荐

