2013-01-31 14 views
5

Ich schreibe eine Qt-App, die um eine QGraphicsScene Leinwand mit beweglichen Formen darauf basiert, und ich versuche, Undo-Redo-Funktionalität zu integrieren. Für die meisten Funktionen, wie das Erstellen und Löschen von Formen, ist es ziemlich trivial, auf der QGraphicsScene selbst zu implementieren, aber ich möchte, dass Elemente beweglich sind und die Bewegung rückgängig gemacht werden kann. Im Moment benutze ich den Gummiband Dragmode und die ItemIsSelectable und ItemIsMovable Flags auf den Items. Das Problem ist, dass es anscheinend keinen guten Ort gibt, um die QUndoCommand Formbewegung darzustellen. Wenn ich es innerhalb der QGraphicsScene::itemChange Methode mache, dann führt das Auswählen und Verschieben von zwei oder mehr Formen zu separaten Rückgängig-Befehlen für verschiedene Objekte, die verschachtelt werden und daher nicht zusammengeführt werden können, so dass das Rückgängigmachen zu unerwartetem Verhalten führt. Es gibt kein Ereignis in der QGraphicsScene, das aufgerufen wird, wenn seine Objekte verschoben werden, die ich sehen kann, also bin ich irgendwie festgefahren.Qt: Richtiges Integrieren von Rückgängig-Framework mit QGraphicsScene

Das Worst-Case-Szenario, das ich sehe, ist, dass ich die ItemIsMovable Flagge auf meinen benutzerdefinierten QGraphicsItem Objekte und Griff Bewegung ganz in den QGraphicsScene Mausereignissen zu deaktivieren, aber diese Funktionalität Neuimplementierung scheint richtig ziemlich kompliziert (ich überprüfte, wie Qt es tut intern und Es gibt eine Menge Code für die Behandlung komplizierter Fälle, z. B. wenn ein Objekt und einige seiner untergeordneten Objekte ausgewählt sind. Dies scheint der offensichtlichste Anwendungsfall für den Undo-Stack zu sein (so sehr, dass das Beispielprogramm für das Undo-Framework ein QGraphicsScene-Programm ist, ähnlich wie bei mir, außer ohne Unterstützung mehrerer Objekte), so dass es merkwürdig erscheint, dass es kein eingebautes Programm gibt Möglichkeit, dies zu tun, ohne einen wesentlichen Teil der Kernfunktionalität erneut zu implementieren. Hat jemand irgendwelche Einsichten oder Beispiele von Programmen, die dies tun?

Antwort

4

Ich löste das etwas hackisch, denke ich. Ich habe eine preMovePoint eigenschaft auf meine eigenen Formen und in den mousePressedEvent der QGraphicsScene, habe ich die preMovePoint jedes der ausgewählten Formen zu ihren jeweiligen aktuellen Positionen und in mouseReleaseEvent, erstellt einen zusammengesetzten Bewegungsbefehl von den preMovePoint die aktuellen pos von jede Form. Ich wäre immer noch interessiert zu wissen, ob es einen besseren Weg gibt.

+0

Ich kam mit einem ähnlich hackish-Update, das einen vorherigen Standortstapel in jedem 'QGraphicsItem' involviert und dann die Elemente, die geändert wurden, in den Rückgängig-Stapel verschiebt. Es ist hässlich, aber es funktioniert. Danke für die Frage und Antwort. –

Verwandte Themen