我想追踪一个对象的全局位置(或相对于其祖先之一),并将其绑定到另一个物品的位置。
我考虑使用mapFromItem
,如下所示:
SomeObject {
x: ancestor.mapFromItem(trackedObject, trackedObject.x, 0).x
y: ancestor.mapFromItem(trackedObject, 0, trackedObject.y).y
}
这种方法的问题在于,mapFromItem
只会被计算一次,而且不会随着它的参数更新而更新。此外,映射有时会返回新位置被偏移的值,我无法在代码中跟踪这个偏移(但这不是关键问题)。我的第二个想法是通过实现一个函数来计算全局位置,该函数会递归地求和偏移量,并在提供的祖先处停止(类似于
calculateOffsetFrom(ancestor)
)。不过这只是一个函数,就我所知它不会在其中一个祖先位置发生更改时重新计算(除非在该函数中将调用绑定到沿途每个祖先的 onXChanged
信号上,但这似乎是一种不太优雅的解决方案)。最终,我向我打算跟踪的对象添加了属性,然后将其绑定到它们上:
TrackedObject {
property real offsetX: x + parent.x + parent.parent.x + parent.parent.parent.x ...
property real offsetY: y + parent.y + parent.parent.y + parent.parent.parent.y ...
}
SomeObject {
x: trackedObject.globalX
y: trackedObject.globalY
}
但是...是的...这个方法根本无法扩展,并且非常丑陋。
有人有任何想法,如何以更清晰的方式解决这个问题吗?
编辑:
就我所知,在这种情况下我无法使用锚点。 SomeObject
组件是绘制从一个点到另一个点的贝塞尔曲线的自定义组件(它将连接两个 TrackedObjects
)。 为此,我需要坐标之间的差异。 如果我没错,锚点没有提供计算它们之间距离的任何方法。