QML - śledzenie globalnej pozycji komponentu

Chciałbym śledzić globalną pozycję obiektu (lub relatywnie do jednego z jego przodków) i powiązać go z pozycją innego przedmiotu.

Myślałem o użyciumapFromItem następująco:

SomeObject {
  x: ancestor.mapFromItem(trackedObject, trackedObject.x, 0).x
  y: ancestor.mapFromItem(trackedObject, 0, trackedObject.y).y
}

Problem z tym podejściem polega na tym, żemapFromItem jest oceniany raz i nie aktualizuje się, ponieważ jeden z jego argumentów jest aktualizowany. Co więcej, mapowanie czasami zwraca nową pozycję zmienioną przez przesunięcie, którego nie mogę śledzić w kodzie (ale to nie jest sprawa).

Moim drugim pomysłem było obliczenie pozycji globalnej poprzez zaimplementowanie funkcji, która rekurencyjnie sumowałaby przesunięcia, zatrzymując się na podanym przodku (coś podobnego docalculateOffsetFrom(ancestor)). Mimo to jest to tylko funkcja i jeśli o mnie chodzi, nie zostanie ona ponownie oceniona, ponieważ jedna ze zmian pozycji przodków (chyba że w tej funkcji powiążę ją zonXChanged sygnał dla każdego z przodków po drodze, co wydaje się brudnym rozwiązaniem).

Tak więc na koniec dodałem właściwości do obiektu, który zamierzam śledzić, a następnie wiążę się z nimi:

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
}

Ale cóż ... tak ... ten nie skaluje się wcale i jest tak brzydki, jak tylko się da.

Czy ktoś ma jakiś pomysł, jak ten problem można rozwiązać w bardziej przejrzysty sposób?

Edytować: Jeśli o mnie chodzi, w tym przypadku nie mogę używać kotwic. TheSomeObject komponent to niestandardowy komponent rysujący krzywą Beziera z jednego punktu do drugiego (połączy dwaTrackedObjects). Do tego potrzebuję różnicy między współrzędnymi. Jeśli mam rację, kotwice nie zapewniają żadnego sposobu obliczania odległości między nimi.

questionAnswers(4)

yourAnswerToTheQuestion