Seite 1 von 1

QCanvas: Undo- und Redo-Funktionen

Verfasst: 25. August 2005 17:09
von Olly
Hallo zusammen!

Ich bin gerade dabei, einen Grafik-Editor zu schreiben, der QCanvas-Elemente benutzt.
Nun bin ich am überlegen, wie ich am besten eine Undo-/Redo-Funktionalität eingebaut bekomme. Hat da jemand schon mal was in der Richtung gemacht und kann mir dazu einen Hinweis geben?

Besten Dank vorab und bleibt gesund! :D

Olly.

Verfasst: 25. August 2005 19:12
von kowi1134
Hallo!

Auf http://www.dsdt.info/tutorials/undoredo/?page=1 gibt es ein gutes Tutorial zu diesem Thema. Es ist erst recht allgemein und implementiert wird das ganze in Delphi, aber zum Verstehen der Sache ist das super!

Ciao

Verfasst: 26. August 2005 08:42
von Olly
Hmja... prinzipiell ist mir ja schon klar, was Undo/Redo bedeutet. Problematisch ist in meinem Fall einfach, daß die Elemente die ich bearbeiten kann, einfach zu komplex sind, um jede einzelne Änderung abzuspeichern (vielleicht bin ich auch einfach zu faul :wink:).

Ich habe es momentan so implementiert, daß ich eine neue QCanvas anlege und den gesamten Inhalt der "Zeichencanvas" dorthin kopiere, bevor die Änderung zugewiesen wird. Der Zeiger auf diese neue QCanvas wird dann in einer Pointerliste abgelegt. Bei entsprechenden Undo/Redo-Operationen wird dann einfach in der Liste vor oder zurück gegangen und die Elemente aus der dort liegenden Canvas werden dann wieder zurück in die "Zeichencanvas" kopiert.

Leider kommt es hierbei irgendwann zu Abstürzen innerhalb von Qt - zumindest scheint es so - ich vermute irgendwo innerhalb des Qt-internen Garbage Collectors.

Verfasst: 26. August 2005 12:09
von Olly
Problem gelöst! :D

Meine Variante des Undo/Redo hat schon gut geklappt.
Das Problem war die Basisklasse, in der die Pixmap für die Selektionsecken der Element erstellt wurde (per Zeiger QPixmap *p_spot). Komischerweise wurde wohl diese Pixmap nur bei einigen Elementen zu spät erzeugt, weswegen hier von Qt versucht wurde, eine Null-Pixmap zu zeichnen. Habe jetzt die Pixmap durch eine Zeichenfunktion in der Basisklasse ersetzt und gut ist. :oops: :D

Hab´s hier hinterlassen, da ja eventuell irgendjemand ein ähnliches Problem haben könnte.

Bleibt gesund!
Olly.