Qt在Item树中快速命中测试



我在场景中有一些项目:

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
  • (26, 32)
  • 就是绿色的Rectangle
  • 对于(15, 15),这将是什么

Qt快速提供一个简单的功能来做到这一点?

如果没有,考虑添加填充矩形的MouseAreas的可能性。我可以合成具有特定(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。

相关内容

  • 没有找到相关文章

最新更新