QUndoCommand Class
Die Klasse „QUndoCommand“ ist die Basisklasse aller Befehle, die in einem „ QUndoStack “ gespeichert sind. Mehr dazu...
| Header: | #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() |
Ausführliche Beschreibung
Einen Überblick über das Undo-Framework von Qt finden Sie im Übersichtsdokument.
Ein `QUndoCommand` repräsentiert eine einzelne Bearbeitungsaktion in einem Dokument, beispielsweise das Einfügen oder Löschen eines Textblocks in einem Texteditor. `QUndoCommand` kann eine Änderung mit ` redo()` auf das Dokument anwenden und die Änderung mit ` undo()` 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); }
bool mergeWith(const QUndoCommand *other) override;
private:
QString *m_document;
QString m_text;
};Einem QUndoCommand ist ein text() zugeordnet. Dabei handelt es sich um eine kurze Zeichenkette, die beschreibt, was der Befehl bewirkt. Sie wird verwendet, um die Texteigenschaften der Rückgängig- und Wiederherstellungsaktionen des Stacks 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 dieser rückgängig gemacht und ein neuer Befehl auf den Stapel geschoben wurde. 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 deletedWenn ein Befehl auf den Stapel gelegt wird, wird er damit zum obersten Befehl auf dem Stapel.
Um die Befehlskomprimierung zu unterstützen, verfügt QUndoCommand über die Funktion ` id()` und die virtuelle Funktion ` mergeWith()`. Diese Funktionen werden von ` QUndoStack::push()` verwendet.
Zur Unterstützung von Befehlsmakros kann ein QUndoCommand-Objekt eine beliebige Anzahl von untergeordneten Befehlen haben. Das Rückgängigmachen oder Wiederherstellen des übergeordneten Befehls führt dazu, dass die untergeordneten Befehle ebenfalls 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 übergeordneten Befehl.
Der übergeordnete Befehl ist in diesem Fall in der Regel ein leerer Befehl, da er keine eigene Implementierung von ` undo()` und ` redo()` bereitstellt. Stattdessen verwendet er die Basisimplementierungen dieser Funktionen, die lediglich ` undo()` oder ` redo()` für alle seine untergeordneten Befehle aufrufen. Der übergeordnete Befehl sollte jedoch über eine aussagekräftige Funktion ` text()` verfügen.
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 weitere Möglichkeit, Makros zu erstellen, ist die Verwendung der Hilfsfunktionen ` QUndoStack::beginMacro()` und ` QUndoStack::endMacro()`.
Siehe auch „ QUndoStack “.
Dokumentation zu Mitgliedsfunktionen
[explicit] QUndoCommand::QUndoCommand(QUndoCommand *parent = nullptr)
Erstellt ein QUndoCommand-Objekt mit dem übergeordneten Objekt „ parent “.
Wenn „ parent “ nicht „ nullptr “ ist, wird dieser Befehl an die untergeordnete 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)
Erstellt ein QUndoCommand-Objekt mit den angegebenen Werten für „ parent “ und „ text “.
Wenn ` parent ` nicht ` nullptr` ist, wird dieser Befehl an die untergeordnete 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()
Löscht das „ QUndoCommand “-Objekt und alle untergeordneten Befehle.
Siehe auch QUndoCommand().
QString QUndoCommand::actionText() const
Gibt eine kurze Textzeichenfolge zurück, die beschreibt, was dieser Befehl bewirkt; zum Beispiel „Text einfügen“.
Der Text wird verwendet, wenn die Texteigenschaften der Rückgängig- und Wiederherstellen-Aktionen des Stacks 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. Es muss sich um eine für die Klasse dieses Befehls eindeutige Ganzzahl handeln oder um -1, falls 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 dieselbe 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 Stack nicht mehr benötigt werden. Die Funktion `isObsolete` wird in den Funktionen ` QUndoStack::push()`, ` QUndoStack::undo()`, ` QUndoStack::redo()` und ` QUndoStack::setIndex()` überprü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. Gibt bei Erfolg „ true “ zurück; andernfalls wird „ false “ zurückgegeben.
Wenn diese Funktion „ true “ zurückgibt, muss der Aufruf von „ redo()“ dieses Befehls denselben Effekt haben wie das erneute Ausführen sowohl dieses Befehls als auch von „ command “. Ebenso muss der Aufruf von „ undo()“ dieses Befehls denselben Effekt haben wie das Rückgängigmachen von „ command “ und dieses Befehls.
QUndoStack Es wird nur versucht, zwei Befehle zusammenzuführen, wenn sie dieselbe 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 werden. Der Aufruf von ` QUndoStack::push()`, ` QUndoStack::undo()` oder ` QUndoStack::redo()` aus dieser Funktion heraus führt zu undefiniertem Verhalten.
Die Standardimplementierung ruft für alle untergeordneten Befehle die Funktion `redo()` auf.
Siehe auch ` undo()`.
void QUndoCommand::setObsolete(bool obsolete)
Legt fest, ob der Befehl für „ obsolete “ veraltet ist.
Siehe auch isObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo() und QUndoStack::redo().
void QUndoCommand::setText(const QString &text)
Legt den Text des Befehls auf den angegebenen „ text “ fest.
Der angegebene Text sollte eine kurze, für den Benutzer verständliche Zeichenfolge sein, die beschreibt, was dieser Befehl bewirkt.
Wenn Sie zwei verschiedene Zeichenfolgen für „ text()“ und „ actionText()“ benötigen, trennen Sie diese durch „\n “ und übergeben Sie sie an diese Funktion. Auch wenn Sie diese Funktion während der Entwicklung nicht für englische Zeichenfolgen nutzen, können Sie Übersetzern dennoch die Verwendung zweier verschiedener Zeichenfolgen ermöglichen, um den Anforderungen bestimmter Sprachen gerecht zu werden. Die beschriebene Funktion sowie 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; zum Beispiel „Text einfügen“.
Der Text wird für die Bezeichnungen 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 heraus führt zu undefiniertem Verhalten.
Die Standardimplementierung ruft `undo()` für alle untergeordneten Befehle in umgekehrter Reihenfolge auf.
Siehe auch „ redo()“.
© 2026 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.