QCanvas: Undo- und Redo-Funktionen

Alles rund um die Programmierung mit Qt
Antworten
Olly
Beiträge: 8
Registriert: 25. August 2005 17:03
Wohnort: Castrop-Rauxel
Kontaktdaten:

QCanvas: Undo- und Redo-Funktionen

Beitrag 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.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag 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
Olly
Beiträge: 8
Registriert: 25. August 2005 17:03
Wohnort: Castrop-Rauxel
Kontaktdaten:

Beitrag 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.
Olly
Beiträge: 8
Registriert: 25. August 2005 17:03
Wohnort: Castrop-Rauxel
Kontaktdaten:

Beitrag 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.
Antworten