Vorrei localizzare una posizione globale di un oggetto (o relativo ad uno dei suoi antenati) e collegarlo ad una posizione di un altro oggetto.QML - rilevamento posizione globale di un componente
Stavo pensando di usare mapFromItem
come segue:
SomeObject {
x: ancestor.mapFromItem(trackedObject, trackedObject.x, 0).x
y: ancestor.mapFromItem(trackedObject, 0, trackedObject.y).y
}
Il problema di questo approccio è che il mapFromItem
viene valutata una volta e non aggiorna come uno dei suoi argomenti viene aggiornata. Inoltre la mappatura a volte restituisce la nuova posizione modificata da un offset che non sono in grado di tracciare nel codice (ma non è questo il caso).
La mia seconda idea era di calcolare la posizione globale implementando una funzione che sommasse ricorsivamente gli offset, fermandosi all'antenato fornito (qualcosa come calculateOffsetFrom(ancestor)
). Tuttavia questa è solo una funzione e, per quanto mi riguarda, non verrà rivalutata come una delle modifiche alla posizione degli antenati (a meno che, in quella funzione, legherò la chiamata al segnale onXChanged
per ognuno di gli antenati lungo la strada, che sembra una soluzione sporca).
proprietà Così alla fine ho aggiunto all'oggetto ho intenzione di tenere traccia e poi mi legano a loro:
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
}
Ma bene ... sì ... questo non è scalabile a tutto ed è così brutto come si arriva.
Qualcuno ha idea di come questo problema possa essere risolto in modo più pulito?
Modifica: Per quanto mi riguarda, non posso utilizzare ancore in questo caso. Il componente SomeObject
è un componente personalizzato che disegna una curva di Bezier da un punto a un altro (collegherà due TrackedObjects
). Per questo ho bisogno della differenza tra le coordinate. Se sono corretto, le ancore non forniscono alcun modo per calcolare la distanza tra loro.
Thanks a lot. Non avrei mai pensato di usare quella bandiera globale per forzare la rivalutazione. Questo sembra sporco ma fa il trucco. –