QGraphicsScene/-View und Undo

Alles rund um die Programmierung mit Qt
Antworten
sieben
Beiträge: 10
Registriert: 18. Juni 2009 08:45

QGraphicsScene/-View und Undo

Beitrag von sieben »

Hallo liebe QT-Community,
ich benutze sowohl das QGraphicsView als auch das Undo-Framework. Das klappt auch bisher ganz gut, jetzt gibt es allerdings ein Problem: Ich möchte, dass die Änderungen, die meine von QUndoCommand abgeleiteten Klassen vornehmen, automatisch sichtbar werden, d. h. dass mein QGraphicsView so scrollt, dass die Änderungen jeweils "im Bild" sind. Es ist ja unschön, wenn der Benutzer Aktionen rückgängig macht und dies gar nicht sieht.

Die meisten Änderungen laufen über meine von QGraphicsScene abgeleitete Klasse, d. h. alle QUndoCommands haben eine Referenz auf ein Scene-Objekt, mit dessen Methoden dann die meisten Änderungen vorgenommen werden.
Ich könnte jetzt z. B. in allen Scene-Methoden, die etwas ändern, einen Aufruf auf die Methode QGraphicsView::ensureVisible(...) einfügen, das View würde ich über QGraphicsScene::views() bekommen. Allerdings fände ich diese Lösung wegen der Redudanz unschön.
Außerdem, da ich mehrere QGraphicsScenes habe, müsste gleichzeitig auch sichergestellt werden, dass das View die richtige Scene anzeigt. d. h. das übergeordnete, zuständige Objekt wäre mein MainWindow.

Meine Idee einer eventuell besseren Lösung wäre also im MainWindow einen Slot zu machen, der ein QRectF und die Nummer der Scene entgegennimmt und das View mit ensureVisible aufruft, und allen meinen von QUndoCommand abgeleiteten Klassen ein entsprechendes Signal zu verpassen, das jeweils bei undo() und redo() ausgelöst wird. An zentraler Stelle, wo das MainWindow die neuen UndoCommands entgegennimmt und dem QUndoStack hinzufügt, könnte ich das dann vorher noch jeweils connect'en.
Allerdings finde ich das immer noch recht umständlich und weiß auch nicht, ob dass dann ggf. 1000xfache Herum-Connecte so stabil/schnell ist.

Am schönsten wäre es ja eigentlich, wenn mir der QUndoStack einfach per Signal mitteilen würde, welches Undo/Redo-Command gerade ausgeführt wurde, dann könnte ich da zentral angreifen, aber so wie ich das sehe, gibt es nur ein Signal indexChanged(int idx), mit dem sich mein Vorhaben ja nicht realisieren lassen würde.

So exotisch ist das Problem doch eigentlich gar nicht, oder?
Fällt euch eine bessere, sauberere Lösung ein?
Antworten