オブジェクトのグローバルな位置 (またはその祖先の 1 つとの相対位置) を追跡し、それを他のアイテムの位置にバインドしたいと考えています。
私は次のように使用することを考えてmapFromItem
いました:
SomeObject {
x: ancestor.mapFromItem(trackedObject, trackedObject.x, 0).x
y: ancestor.mapFromItem(trackedObject, 0, trackedObject.y).y
}
このアプローチの問題は、mapFromItem
が一度評価され、その引数の 1 つが更新されても更新されないことです。さらに、マッピングは、コードで追跡できないオフセットによって変更された新しい位置を返すことがあります (しかし、それは手元の問題ではありません)。
私の 2 番目のアイデアは、オフセットを再帰的に合計する関数を実装し、提供された祖先 ( のようなもの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
コンポーネントは、ある点から別の点へのベジェ曲線を描くカスタム コンポーネントです (2 つの を接続しますTrackedObjects
)。そのためには、座標の違いが必要です。私が正しければ、アンカーはそれらの間の距離を計算する方法を提供しません。