QML - tracking Globale position einer Komponente
Ich würde wie zu verfolgen eine Globale position eines Objektes (oder relativ zu einer seiner Vorfahren) und binden Sie es an ein anderes Element, position.
Ich dachte über die Verwendung von mapFromItem
wie folgt:
SomeObject {
x: ancestor.mapFromItem(trackedObject, trackedObject.x, 0).x
y: ancestor.mapFromItem(trackedObject, 0, trackedObject.y).y
}
Das problem bei diesem Ansatz ist, dass die mapFromItem
einmal ausgewertet und aktualisiert nicht als eine von Argumente wird aktualisiert. Darüber hinaus ist die Zuordnung manchmal gibt die neue position verändert werden, indem ein offset ich bin nicht in der Lage zu verfolgen, in den code (das ist aber nicht die Sache bei der hand).
Meine zweite Idee war die Berechnung der globalen position durch die Implementierung einer Funktion, die würde, die rekursiv die Summe der offsets, halt an den bereitgestellten Vorfahren (so etwas wie calculateOffsetFrom(ancestor)
). Noch ist dies nur eine Funktion, und soweit ich bin besorgt, es wird nicht neu bewertet zu bekommen, als einer der Vorfahren position ändert (es sei denn, in dieser Funktion, ich werde binden, nannte es der onXChanged
signal für jeden der Vorfahren auf dem Weg, das scheint wie eine dirty Lösung).
Also am Ende habe ich Hinzugefügt, die Eigenschaften zu dem Objekt, ich habe die Absicht zu verfolgen, und dann habe ich an Sie:
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
}
Aber gut... ja... das man nicht skalieren und ist so hässlich wie es nur geht.
Hat jemand eine Idee, wie dieses problem gelöst werden könnte sauberer?
Edit:
Soweit ich bin besorgt, ich kann nicht mit Anker in diesem Fall. Die SomeObject
Komponente ist eine benutzerdefinierte Komponente zeichnen einer Bézier-Kurve von einem Punkt zum anderen (es verbindet zwei TrackedObjects
). Dafür muss ich die Differenz zwischen den Koordinaten. Wenn ich richtig bin Anker bieten keine Möglichkeit, die Berechnung der Entfernung zwischen Ihnen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein harter Punkt, aber hier ist der hack den ich verwendet in einem meiner Projekte : die blau-rect, die in einem anderen Elternteil als grün rect bewegen, zu bleiben, mit ihm ausgerichtet, wenn grün rect bewegt, sondern auch, wenn gelb rect (grün rect Eltern) bewegt :
Der trick ist, um alle Koordinaten wieder auf den ersten gemeinsamen Vorfahren, mit beiden mapfromItem und mapToItem, und erzwingen Sie die Funktion überprüft werden, setzen Sie einfach eine Globale boolean-flag, das Sie an die computing-Funktion, und dass Sie umkehren, jeder Zeit mit einem beweglichen element auf der Karte bewegt... Sie nicht haben, um es zu stellen, wo jeder nur auf Eltern von Gegenständen, die sich bewegen und sind innerhalb der Vorfahr-Element.
So funktioniert es, Ihre Positionen werden immer Recht, und es ist durchaus skalierbar und nicht viel hinzuzufügen-code.
Die Lösung unten löst die qmlElementToTrack.onPropertyNameXChanged() und qmlElementToTrack.onPropertyNameYChanged() Veranstaltungen jedes mal, wenn man von seinen Eltern 'x' oder 'y' Werte ändern.
Er tut dies durch das anbringen an jeder Elternteil ist onXChanged() und onYChanged() Signale. Wenn einer dieser Werte ändert, berechnet die propertyNameX oder propertyNameY Werte durch das Durchlaufen aller qmlElementToTrack ist Eltern.
Machen es 'relativ' positioniert (statt "absolut"), fügen Sie current !== qmlElementToStopAt zu jedem while () - Bedingung.
HTML:
JS:
onXChanged
undonYChanged
sollte es wohl auch eine Verbindung zuonParentChanged
so, dass jede re-parenting Tricks auch verfolgt.Ich weiß nicht, ob das helfen wird, aber für die oben gelb rechteckig,blau rect und grün rect problem erwähnt TheBootroo, ich verwendete den folgenden code, um das problem zu lösen
Die Idee ist, die zum berechnen der position des blauen Rechtecks relativ zu dem grünen Rechteck, durch
die Berechnung der position des grünen Rechtecks und seiner visuellen Vorfahren.
Die inspiration hinter dieser Lösung ist -> http://developer.nokia.com/Community/Wiki/How_to_create_a_Context_Menu_with_QML
Habe ich zu verbessern versucht, auf @Shubhanga Antwort ein bisschen durch das verschieben des code in seine eigene ItemPositionTracker.qml-Datei:
Kann der code nun eingefügt werden, QML-Objekt wie folgt:
Macht rectBlue Folgen rectGreen.
Tracking-bestimmtes Element der globalen Positionen scheint ein wichtiges problem, wenn die Entwicklung einige komplexe Grafiken-Interaktion. Ich kam mit einer relativ einfachen & anmutige Lösung. Hier ist mein core-codes:
Ist der Kerngedanke ist: das, was im wesentlichen bewirkt, dass ein Element der globalen position ändern? Es vielleicht selbst, seine Eltern oder seine Eltern Elternteil usw. So machen eine traverse zurück zu seiner am weitesten übergeordneten und schließen jedes seiner Vorfahren, die x/y-Signalen ändern, um eine Funktion, innerhalb der wir das Element Globale position und broadcast außerhalb.