如何基于其他QML Item的anchors.left和anchors.right设置Item宽度?
如何让QML Item的宽度基于其他Item的anchors.left和anchors.right属性值?
其实这个问题的核心是利用QML Item自带的位置属性来做计算——每个Item的left、right、top、bottom都是实时的坐标值(相对于父容器的坐标系),直接用这些值相减就能得到你要的宽度。
先看你举的简单例子:
Rectangle { width: 400 height: 400 Rectangle { width: parent.right - parent.left height: parent.height } }
这里parent.right其实是parent.x + parent.width,parent.left就是parent.x,所以相减结果和parent.width完全一致,这也就是为什么你说直接用width: parent.width更简单。
那到了锚点属于不同Item的场景,这个思路同样适用。举个实际的例子:假设我们有左右两个独立的矩形,想要在它们之间放一个宽度刚好填满空隙的矩形,代码可以这么写:
Rectangle { width: 400 height: 400 // 左侧的参考矩形 Rectangle { id: leftRef x: 50 width: 100 height: 300 color: "lightblue" } // 右侧的参考矩形 Rectangle { id: rightRef x: 250 width: 80 height: 300 color: "lightgreen" } // 我们要设置宽度的目标矩形 Rectangle { // 锚定左右边缘到两个参考矩形的对应边缘 anchors.left: leftRef.right anchors.right: rightRef.left height: 300 color: "salmon" // 如果非要手动计算宽度(其实QML会自动帮你算,但演示逻辑的话) // width: rightRef.left - leftRef.right } }
这里重点是:
leftRef.right是左侧矩形右边缘的坐标值(等于leftRef.x + leftRef.width)rightRef.left是右侧矩形左边缘的坐标值(等于rightRef.x)- 两者相减的结果,就是两个边缘之间的距离,也就是目标矩形需要的宽度
另外要注意:如果你的锚定关系是跨父容器的,只要确保这些Item在同一个坐标系下(或者用mapToItem来转换坐标),计算逻辑也是一样的。比如如果rightRef在另一个父容器里,你可以用rightRef.mapToItem(parent, rightRef.left, 0).x来获取它在当前目标矩形父容器里的x坐标,再做计算。
总结一下:不管锚定的是同一个还是不同的Item,只要拿到两个锚定目标的边缘坐标值,用右侧的坐标减去左侧的坐标,就能得到你需要的宽度啦。
内容的提问来源于stack exchange,提问作者Paul Wintz
相关产品推荐
相关产品推荐

