Я хотел бы отслеживать глобальную позицию объекта (или относительно одного из его предков) и привязывать его к позиции какого-либо другого элемента.QML - отслеживание глобальной позиции компонента
Я думал об использовании 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
). Для этого мне нужна разница между координатами. Если я правильно поставил якорь, не давайте никакого способа вычислить расстояние между ними.
Спасибо большое. Не подумал бы подумать об использовании этого глобального флага для принудительной переоценки. Это кажется грязным, но это делает трюк. –