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?
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. –