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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:13:40