QUndoCommand Class
Die Klasse QUndoCommand ist die Basisklasse aller Befehle, die auf QUndoStack gespeichert sind. Mehr...
Kopfzeile: | #include <QUndoCommand> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
Öffentliche Funktionen
QUndoCommand(QUndoCommand *parent = nullptr) | |
QUndoCommand(const QString &text, QUndoCommand *parent = nullptr) | |
virtual | ~QUndoCommand() |
QString | actionText() const |
const QUndoCommand * | child(int index) const |
int | childCount() const |
virtual int | id() const |
bool | isObsolete() const |
virtual bool | mergeWith(const QUndoCommand *command) |
virtual void | redo() |
void | setObsolete(bool obsolete) |
void | setText(const QString &text) |
QString | text() const |
virtual void | undo() |
Detaillierte Beschreibung
Einen Überblick über das Undo Framework von Qt finden Sie im Übersichtsdokument.
Ein QUndoCommand repräsentiert eine einzelne Bearbeitungsaktion an einem Dokument; zum Beispiel das Einfügen oder Löschen eines Textblocks in einem Texteditor. QUndoCommand kann mit redo() eine Änderung auf das Dokument anwenden und mit undo() die Änderung rückgängig machen. Die Implementierungen für diese Funktionen müssen in einer abgeleiteten Klasse bereitgestellt werden.
class AppendText : public QUndoCommand { public: AppendText(QString *doc, const QString &text) : m_document(doc), m_text(text) { setText("append text"); } void undo() override { m_document->chop(m_text.length()); } void redo() override { m_document->append(m_text); } private: QString *m_document; QString m_text; };
Ein QUndoCommand hat eine zugehörige text(). Dies ist eine kurze Zeichenkette, die beschreibt, was der Befehl tut. Er wird verwendet, um die Texteigenschaften der Rückgängig- und Wiederherstellungsaktionen des Stapels zu aktualisieren; siehe QUndoStack::createUndoAction() und QUndoStack::createRedoAction().
QUndoCommand-Objekte gehören dem Stapel, auf den sie geschoben wurden. QUndoStack löscht einen Befehl, wenn er rückgängig gemacht wurde und ein neuer Befehl geschoben wird. Ein Beispiel:
MyCommand *command1 = new MyCommand(); stack->push(command1); MyCommand *command2 = new MyCommand(); stack->push(command2); stack->undo(); MyCommand *command3 = new MyCommand(); stack->push(command3); // command2 gets deleted
Wenn ein Befehl gepusht wird, wird er der oberste Befehl auf dem Stack.
Zur Unterstützung der Befehlskomprimierung verfügt QUndoCommand über eine id() und die virtuelle Funktion mergeWith(). Diese Funktionen werden von QUndoStack::push() verwendet.
Um Befehlsmakros zu unterstützen, kann ein QUndoCommand-Objekt eine beliebige Anzahl von untergeordneten Befehlen haben. Das Rückgängigmachen oder Wiederherstellen des übergeordneten Befehls bewirkt, dass die untergeordneten Befehle rückgängig gemacht oder wiederhergestellt werden. Ein Befehl kann im Konstruktor explizit einem übergeordneten Befehl zugewiesen werden. In diesem Fall gehört der Befehl dem Elternteil.
Der übergeordnete Befehl ist in diesem Fall normalerweise ein leerer Befehl, da er keine eigene Implementierung von undo() und redo() bereitstellt. Stattdessen verwendet er die Basisimplementierungen dieser Funktionen, die einfach undo() oder redo() für alle seine Kinder aufrufen. Die übergeordnete Funktion sollte jedoch eine sinnvolle text() haben.
QUndoCommand *insertRed = new QUndoCommand(); // an empty command insertRed->setText("insert red text"); new InsertText(document, idx, text, insertRed); // becomes child of insertRed new SetColor(document, idx, text.length(), Qt::red, insertRed); stack.push(insertRed);
Eine andere Möglichkeit, Makros zu erstellen, ist die Verwendung der Komfortfunktionen QUndoStack::beginMacro() und QUndoStack::endMacro().
Siehe auch QUndoStack.
Dokumentation der Mitgliedsfunktionen
[explicit]
QUndoCommand::QUndoCommand(QUndoCommand *parent = nullptr)
Konstruiert ein QUndoCommand-Objekt mit übergeordnetem parent.
Wenn parent nicht nullptr
ist, wird dieser Befehl an die Child-Liste des übergeordneten Befehls angehängt. Der übergeordnete Befehl ist dann Eigentümer dieses Befehls und löscht ihn in seinem Destruktor.
Siehe auch ~QUndoCommand().
[explicit]
QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent = nullptr)
Konstruiert ein QUndoCommand-Objekt mit den angegebenen parent und text.
Wenn parent nicht nullptr
ist, wird dieser Befehl an die Child-Liste des übergeordneten Befehls angehängt. Der übergeordnete Befehl ist dann Eigentümer dieses Befehls und löscht ihn in seinem Destruktor.
Siehe auch ~QUndoCommand().
[virtual noexcept]
QUndoCommand::~QUndoCommand()
Zerstört das Objekt QUndoCommand und alle untergeordneten Befehle.
Siehe auch QUndoCommand().
QString QUndoCommand::actionText() const
Gibt eine kurze Textzeichenfolge zurück, die beschreibt, was dieser Befehl bewirkt, z. B. "Text einfügen".
Der Text wird verwendet, wenn die Texteigenschaften der Rückgängig- und Wiederherstellungsaktionen des Stapels aktualisiert werden.
Siehe auch text(), setText(), QUndoStack::createUndoAction(), und QUndoStack::createRedoAction().
const QUndoCommand *QUndoCommand::child(int index) const
Gibt den untergeordneten Befehl unter index zurück.
Siehe auch childCount() und QUndoStack::command().
int QUndoCommand::childCount() const
Gibt die Anzahl der untergeordneten Befehle in diesem Befehl zurück.
Siehe auch child().
[virtual]
int QUndoCommand::id() const
Gibt die ID dieses Befehls zurück.
Eine Befehls-ID wird bei der Befehlskomprimierung verwendet. Sie muss eine ganze Zahl sein, die für die Klasse dieses Befehls eindeutig ist, oder -1, wenn der Befehl keine Komprimierung unterstützt.
Wenn der Befehl die Komprimierung unterstützt, muss diese Funktion in der abgeleiteten Klasse überschrieben werden, um die richtige ID zurückzugeben. Die Basisimplementierung gibt -1 zurück.
QUndoStack::push() versucht nur dann, zwei Befehle zusammenzuführen, wenn sie die gleiche ID haben und die ID nicht -1 ist.
Siehe auch mergeWith() und QUndoStack::push().
bool QUndoCommand::isObsolete() const
Gibt zurück, ob der Befehl veraltet ist.
Der boolesche Wert wird für die automatische Entfernung von Befehlen verwendet, die im Stapel nicht mehr benötigt werden. Die Funktion isObsolete wird in den Funktionen QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo(), und QUndoStack::setIndex() geprüft.
Siehe auch setObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo(), und QUndoStack::redo().
[virtual]
bool QUndoCommand::mergeWith(const QUndoCommand *command)
Versucht, diesen Befehl mit command zusammenzuführen. Bei Erfolg wird true
zurückgegeben; andernfalls wird false
zurückgegeben.
Wenn diese Funktion true
zurückgibt, muss der Aufruf von redo() die gleiche Wirkung haben wie die Wiederholung dieses Befehls und command. Ebenso muss der Aufruf von undo() dieses Befehls die gleiche Wirkung haben wie das Rückgängigmachen von command und dieses Befehls.
QUndoStack wird nur dann versuchen, zwei Befehle zusammenzuführen, wenn sie die gleiche id haben und die id nicht -1 ist.
Die Standardimplementierung gibt false
zurück.
bool AppendText::mergeWith(const QUndoCommand *other) { if (other->id() != id()) // make sure other is also an AppendText command return false; m_text += static_cast<const AppendText*>(other)->m_text; return true; }
Siehe auch id() und QUndoStack::push().
[virtual]
void QUndoCommand::redo()
Wendet eine Änderung auf das Dokument an. Diese Funktion muss in der abgeleiteten Klasse implementiert sein. Der Aufruf von QUndoStack::push(), QUndoStack::undo() oder QUndoStack::redo() aus dieser Funktion führt zu undefiniertem Verhalten.
Die Standardimplementierung ruft redo() bei allen untergeordneten Befehlen auf.
Siehe auch undo().
void QUndoCommand::setObsolete(bool obsolete)
Legt fest, ob der Befehl auf obsolete veraltet ist.
Siehe auch isObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo(), und QUndoStack::redo().
void QUndoCommand::setText(const QString &text)
Setzt den Text des Befehls auf den angegebenen text.
Der angegebene Text sollte eine kurze, für den Benutzer lesbare Zeichenkette sein, die beschreibt, was dieser Befehl tut.
Wenn Sie zwei verschiedene Zeichenketten für text() und actionText() benötigen, trennen Sie sie mit "\n" und übergeben Sie sie an diese Funktion. Auch wenn Sie diese Funktion während der Entwicklung nicht für englische Zeichenketten verwenden, können Sie Übersetzern die Möglichkeit geben, zwei verschiedene Zeichenketten zu verwenden, um die Anforderungen bestimmter Sprachen zu erfüllen. Das beschriebene Feature und die Funktion actionText() sind seit Qt 4.8 verfügbar.
Siehe auch text(), actionText(), QUndoStack::createUndoAction(), und QUndoStack::createRedoAction().
QString QUndoCommand::text() const
Gibt eine kurze Textzeichenfolge zurück, die beschreibt, was dieser Befehl bewirkt, z. B. "Text einfügen".
Der Text wird für die Namen der Elemente in QUndoView verwendet.
Siehe auch actionText(), setText(), QUndoStack::createUndoAction(), und QUndoStack::createRedoAction().
[virtual]
void QUndoCommand::undo()
Macht eine Änderung am Dokument rückgängig. Nach dem Aufruf von Undo() sollte der Zustand des Dokuments derselbe sein wie vor dem Aufruf von redo(). Diese Funktion muss in der abgeleiteten Klasse implementiert werden. Der Aufruf von QUndoStack::push(), QUndoStack::undo() oder QUndoStack::redo() aus dieser Funktion führt zu undefiniertem Verhalten.
Die Standardimplementierung ruft undo() für alle untergeordneten Befehle in umgekehrter Reihenfolge auf.
Siehe auch redo().
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.