Sur cette page

QUndoCommand Class

La classe QUndoCommand est la classe de base de toutes les commandes stockées sur QUndoStack. Plus....

En-tête : #include <QUndoCommand>
CMake : find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake : QT += gui

Fonctions publiques

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()

Description détaillée

Pour une vue d'ensemble du cadre d'annulation de Qt, voir le document de présentation.

Une QUndoCommand représente une action d'édition unique sur un document ; par exemple, l'insertion ou la suppression d'un bloc de texte dans un éditeur de texte. QUndoCommand peut appliquer une modification au document avec redo() et annuler la modification avec undo(). Les implémentations de ces fonctions doivent être fournies dans une classe dérivée.

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;
};

Une QUndoCommand est associée à text(). Il s'agit d'une courte chaîne de caractères décrivant l'action de la commande. Elle est utilisée pour mettre à jour les propriétés de texte des actions d'annulation et de rétablissement de la pile ; voir QUndoStack::createUndoAction() et QUndoStack::createRedoAction().

Les objets QUndoCommand appartiennent à la pile sur laquelle ils ont été poussés. QUndoStack supprime une commande si elle a été annulée et qu'une nouvelle commande est poussée. Par exemple, la commande est supprimée si elle a été annulée et qu'une nouvelle commande est poussée :

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

En effet, lorsqu'une commande est poussée, elle devient la commande la plus élevée de la pile.

Pour prendre en charge la compression des commandes, QUndoCommand dispose d'une fonction id() et de la fonction virtuelle mergeWith(). Ces fonctions sont utilisées par QUndoStack::push().

Pour prendre en charge les macros de commande, un objet QUndoCommand peut avoir un nombre quelconque de commandes enfant. L'annulation ou le rétablissement de la commande parent entraîne l'annulation ou le rétablissement des commandes enfant. Une commande peut être assignée à un parent explicitement dans le constructeur. Dans ce cas, la commande appartiendra au parent.

Dans ce cas, le parent est généralement une commande vide, en ce sens qu'il ne fournit pas sa propre implémentation de undo() et redo(). Au lieu de cela, il utilise les implémentations de base de ces fonctions, qui appellent simplement undo() ou redo() sur tous ses enfants. Le parent doit cependant avoir un text() significatif.

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);

Une autre façon de créer des macros consiste à utiliser les fonctions de commodité QUndoStack::beginMacro() et QUndoStack::endMacro().

Voir également QUndoStack.

Documentation sur les fonctions membres

[explicit] QUndoCommand::QUndoCommand(QUndoCommand *parent = nullptr)

Construit un objet QUndoCommand avec le parent parent.

Si parent n'est pas nullptr, cette commande est ajoutée à la liste des enfants du parent. La commande parent possède alors cette commande et la supprimera dans son destructeur.

Voir aussi ~QUndoCommand().

[explicit] QUndoCommand::QUndoCommand(const QString &text, QUndoCommand *parent = nullptr)

Construit un objet QUndoCommand avec les données parent et text.

Si parent n'est pas nullptr, cette commande est ajoutée à la liste des enfants du parent. La commande parent possède alors cette commande et la supprimera dans son destructeur.

Voir aussi ~QUndoCommand().

[virtual noexcept] QUndoCommand::~QUndoCommand()

Détruit l'objet QUndoCommand et toutes les commandes enfant.

Voir aussi QUndoCommand().

QString QUndoCommand::actionText() const

Renvoie une courte chaîne de texte décrivant ce que fait cette commande ; par exemple, "insérer du texte".

Ce texte est utilisé lorsque les propriétés de texte des actions d'annulation et de rétablissement de la pile sont mises à jour.

Voir également text(), setText(), QUndoStack::createUndoAction() et QUndoStack::createRedoAction().

const QUndoCommand *QUndoCommand::child(int index) const

Renvoie la commande enfant à index.

Voir aussi childCount() et QUndoStack::command().

int QUndoCommand::childCount() const

Renvoie le nombre de commandes enfants dans cette commande.

Voir aussi child().

[virtual] int QUndoCommand::id() const

Renvoie l'ID de cette commande.

L'identifiant de la commande est utilisé pour la compression des commandes. Il doit s'agir d'un entier unique à la classe de cette commande, ou de -1 si la commande ne supporte pas la compression.

Si la commande supporte la compression, cette fonction doit être surchargée dans la classe dérivée pour renvoyer l'identifiant correct. L'implémentation de base renvoie -1.

QUndoStack::push() n'essaiera de fusionner deux commandes que si elles ont le même ID, et si l'ID n'est pas -1.

Voir aussi mergeWith() et QUndoStack::push().

bool QUndoCommand::isObsolete() const

Indique si la commande est obsolète.

Ce booléen est utilisé pour la suppression automatique des commandes qui ne sont plus nécessaires dans la pile. La fonction isObsolete est vérifiée dans les fonctions QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo() et QUndoStack::setIndex().

Voir aussi setObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo() et QUndoStack::redo().

[virtual] bool QUndoCommand::mergeWith(const QUndoCommand *command)

Tente de fusionner cette commande avec command. Renvoie true en cas de succès, sinon false.

Si cette fonction renvoie true, l'appel à la commande redo() doit avoir le même effet que de refaire à la fois cette commande et command. De même, l'appel à undo() de cette commande doit avoir le même effet que l'annulation de command et de cette commande.

QUndoStack n'essaiera de fusionner deux commandes que si elles ont le même identifiant, et si l'identifiant n'est pas -1.

L'implémentation par défaut renvoie false.

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;
}

Voir aussi id() et QUndoStack::push().

[virtual] void QUndoCommand::redo()

Applique une modification au document. Cette fonction doit être implémentée dans la classe dérivée. L'appel de QUndoStack::push(), QUndoStack::undo() ou QUndoStack::redo() à partir de cette fonction entraîne un comportement non défini.

L'implémentation par défaut appelle redo() sur toutes les commandes enfant.

Voir également undo().

void QUndoCommand::setObsolete(bool obsolete)

Indique si la commande est obsolète à obsolete.

Voir aussi isObsolete(), mergeWith(), QUndoStack::push(), QUndoStack::undo() et QUndoStack::redo().

void QUndoCommand::setText(const QString &text)

Définit le texte de la commande à l'adresse text spécifiée.

Le texte spécifié doit être une courte chaîne lisible par l'utilisateur décrivant ce que fait cette commande.

Si vous avez besoin de deux chaînes différentes pour text() et actionText(), séparez-les par "\n" et passez-les dans cette fonction. Même si vous n'utilisez pas cette fonction pour les chaînes anglaises pendant le développement, vous pouvez toujours laisser les traducteurs utiliser deux chaînes différentes afin de répondre aux besoins de langues spécifiques. La fonctionnalité décrite et la fonction actionText() sont disponibles depuis Qt 4.8.

Voir aussi text(), actionText(), QUndoStack::createUndoAction(), et QUndoStack::createRedoAction().

QString QUndoCommand::text() const

Renvoie une courte chaîne de texte décrivant l'action de cette commande ; par exemple, "insérer du texte".

Le texte est utilisé pour les noms des éléments dans QUndoView.

Voir également actionText(), setText(), QUndoStack::createUndoAction() et QUndoStack::createRedoAction().

[virtual] void QUndoCommand::undo()

Annule une modification apportée au document. Après l'appel à undo(), l'état du document doit être le même qu'avant l'appel à redo(). Cette fonction doit être implémentée dans la classe dérivée. L'appel de QUndoStack::push(), QUndoStack::undo() ou QUndoStack::redo() à partir de cette fonction entraîne un comportement non défini.

L'implémentation par défaut appelle undo() sur toutes les commandes enfant dans l'ordre inverse.

Voir également 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.