我在场景中有一些项目:
Rectangle {
x: 20
y: 20
width: 20
height: 20
color: 'red'
Rectangle {
x: 5
y: 10
width: 5
height: 5
color: 'green'
}
}
现在我想知道:给定一个(x, y)坐标,哪个是在该坐标上渲染的最顶层可见项?
例如:
- 对于
(21, 21)
就是红色的Rectangle
- 就是绿色的
Rectangle
- 对于
(15, 15)
,这将是什么
(26, 32)
的Qt快速提供一个简单的功能来做到这一点?
如果没有,考虑添加填充矩形的MouseArea
s的可能性。我可以合成具有特定(x, y)坐标的按事件吗?这就更好了。
我认为你需要的是Qml Item的方法之一。你应该看看childAt方法或visibleChildren属性。
由于Item.childAt(...)
在这方面被打破了,它有一个10年前打开的错误报告,尚未修复,我想出了这个解决方案:
function traverseItemTreeWithClipping(item, pt, f, rootItem) {
rootItem = rootItem || item
var p = item.mapFromItem(rootItem, pt)
var inItemRect = p.x >= 0 && p.y >= 0 && p.x < item.width && p.y < item.height
if(item.clip && !inItemRect) return
f(item, p, inItemRect)
for(var i = 0; i < item.children.length; i++)
traverseItemTreeWithClipping(item.children[i], pt, f, rootItem)
}
function hitTest(rootItem, pt) {
var result = undefined
var z = -Infinity
traverseItemTreeWithClipping(rootItem, pt, (item, p, inItemRect) => {
if(item.visible && item.z >= z && inItemRect) {
result = item
z = item.z
}
})
return result
}
考虑了items的z
属性,返回真正可见的Item。