我想跟踪一个对象的全局位置(或相对于它的一个祖先)并将其绑定到其他项目的位置。
我正在考虑使用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
)。为此,我需要坐标之间的差异。如果我是正确的,锚不提供任何计算它们之间距离的方法。