Sur cette page

QUndoStack Class

La classe QUndoStack est une pile d'objets QUndoCommand. Plus d'informations...

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

Propriétés

Fonctions publiques

QUndoStack(QObject *parent = nullptr)
virtual ~QUndoStack()
void beginMacro(const QString &text)
bool canRedo() const
bool canUndo() const
int cleanIndex() const
void clear()
const QUndoCommand *command(int index) const
int count() const
QAction *createRedoAction(QObject *parent, const QString &prefix = QString()) const
QAction *createUndoAction(QObject *parent, const QString &prefix = QString()) const
void endMacro()
int index() const
bool isActive() const
bool isClean() const
void push(QUndoCommand *cmd)
QString redoText() const
void setUndoLimit(int limit)
QString text(int idx) const
int undoLimit() const
QString undoText() const

Emplacements publics

void redo()
void resetClean()
void setActive(bool active = true)
void setClean()
void setIndex(int idx)
void undo()

Signaux

void canRedoChanged(bool canRedo)
void canUndoChanged(bool canUndo)
void cleanChanged(bool clean)
void indexChanged(int idx)
void redoTextChanged(const QString &redoText)
void undoTextChanged(const QString &undoText)

Description détaillée

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

Une pile d'annulation maintient une pile de commandes qui ont été appliquées à un document.

Les nouvelles commandes sont placées sur la pile à l'aide de push(). Les commandes peuvent être annulées et refaites en utilisant undo() et redo(), ou en déclenchant les actions renvoyées par createUndoAction() et createRedoAction().

QUndoStack garde la trace de la commande current. Il s'agit de la commande qui sera exécutée lors du prochain appel à redo(). L'index de cette commande est renvoyé par index(). L'état de l'objet édité peut être avancé ou reculé en utilisant setIndex(). Si la commande la plus élevée de la pile a déjà été refaite, index() est égal à count().

QUndoStack prend en charge les actions d'annulation et de rétablissement, la compression des commandes, les macros de commande et le concept d'état propre.

Actions d'annulation et de rétablissement

QUndoStack fournit des objets pratiques d'annulation et de rétablissement QAction, qui peuvent être insérés dans un menu ou une barre d'outils. Lorsque des commandes sont annulées ou refaites, QUndoStack met à jour les propriétés de texte de ces actions pour refléter le changement qu'elles vont déclencher. Les actions sont également désactivées lorsqu'aucune commande n'est disponible pour être annulée ou rétablie. Ces actions sont renvoyées par QUndoStack::createUndoAction() et QUndoStack::createRedoAction().

Compression des commandes et macros

La compression des commandes est utile lorsque plusieurs commandes peuvent être comprimées en une seule commande qui peut être annulée et refaite en une seule opération. Par exemple, lorsqu'un utilisateur tape un caractère dans un éditeur de texte, une nouvelle commande est créée. Cette commande insère le caractère dans le document à la position du curseur. Toutefois, il est plus pratique pour l'utilisateur de pouvoir annuler ou refaire la saisie de mots, de phrases ou de paragraphes entiers. La compression des commandes permet de fusionner ces commandes à caractère unique en une seule commande qui insère ou supprime des sections de texte. Pour plus d'informations, voir QUndoCommand::mergeWith() et push().

Une macro-commande est une séquence de commandes qui sont toutes annulées et refaites en une seule fois. Les macros de commande sont créées en donnant à une commande une liste de commandes enfant. L'annulation ou le rétablissement de la commande parent entraîne l'annulation ou le rétablissement des commandes enfants. Les macros de commande peuvent être créées explicitement en spécifiant un parent dans le constructeur QUndoCommand, ou en utilisant les fonctions de commodité beginMacro() et endMacro().

Bien que la compression de commandes et les macros semblent avoir le même effet pour l'utilisateur, elles ont souvent des utilisations différentes dans une application. Les commandes qui apportent de petites modifications à un document peuvent être utilement compressées s'il n'est pas nécessaire de les enregistrer individuellement et si seules les modifications plus importantes sont pertinentes pour l'utilisateur. Cependant, pour les commandes qui doivent être enregistrées individuellement, ou celles qui ne peuvent pas être compressées, il est utile d'utiliser des macros pour offrir une expérience utilisateur plus pratique tout en conservant un enregistrement de chaque commande.

État propre

QUndoStack prend en charge le concept d'état propre. Lorsque le document est enregistré sur le disque, la pile peut être marquée comme propre à l'aide de setClean(). Chaque fois que la pile revient à cet état par des commandes d'annulation et de rétablissement, elle émet le signal cleanChanged(). Ce signal est également émis lorsque la pile quitte l'état "clean". Ce signal est généralement utilisé pour activer et désactiver les actions de sauvegarde dans l'application, et pour mettre à jour le titre du document afin de refléter le fait qu'il contient des modifications non sauvegardées.

Commandes obsolètes

QUndoStack est capable de supprimer des commandes de la pile si la commande n'est plus nécessaire. Un exemple peut être la suppression d'une commande lorsque deux commandes sont fusionnées de telle sorte que la commande fusionnée n'a plus de fonction. C'est le cas des commandes de déplacement : l'utilisateur déplace sa souris vers une partie de l'écran, puis la ramène à sa position d'origine. La commande fusionnée entraîne un déplacement de la souris de 0. Cette commande peut être supprimée car elle ne sert à rien. Un autre exemple est celui des commandes de réseau qui échouent en raison de problèmes de connexion. Dans ce cas, la commande doit être supprimée de la pile, car les fonctions redo() et undo() n'ont aucune utilité en raison des problèmes de connexion.

Une commande peut être marquée comme obsolète avec la fonction QUndoCommand::setObsolete(). L'indicateur QUndoCommand::isObsolete() est vérifié dans QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo() et QUndoStack::setIndex() après avoir appelé QUndoCommand::undo(), QUndoCommand::redo() et QUndoCommand:mergeWith() le cas échéant.

Si une commande est déclarée obsolète et que l'index propre est supérieur ou égal à l'index de la commande actuelle, l'index propre sera réinitialisé lorsque la commande sera supprimée de la pile.

Voir également QUndoCommand et QUndoView.

Documentation sur les propriétés

active : bool

Cette propriété indique l'état actif de cette pile.

Une application possède souvent plusieurs piles d'annulation, une pour chaque document ouvert. La pile active est celle qui est associée au document actuellement actif. Si la pile appartient à un QUndoGroup, les appels à QUndoGroup::undo() ou QUndoGroup::redo() seront transmis à cette pile lorsqu'elle est active. Si QUndoGroup est surveillé par QUndoView, la vue affichera le contenu de cette pile lorsqu'elle sera active. Si la pile n'appartient pas à un QUndoGroup, la rendre active n'a aucun effet.

Il incombe au programmeur de préciser quelle pile est active en appelant setActive(), généralement lorsque la fenêtre de document associée reçoit le focus.

Fonctions d'accès :

bool isActive() const
void setActive(bool active = true)

Voir également QUndoGroup.

[read-only] canRedo : bool

Cette propriété indique si cette pile peut être refaite.

Cette propriété indique s'il existe ou non une commande qui peut être refaite.

Fonctions d'accès :

bool canRedo() const

Notifier signal :

void canRedoChanged(bool canRedo)

Voir aussi canRedo(), index() et canUndo().

[read-only] canUndo : bool

Cette propriété indique si cette pile peut être annulée.

Cette propriété indique si une commande peut être annulée ou non.

Fonctions d'accès :

bool canUndo() const

Notifier signal :

void canUndoChanged(bool canUndo)

Voir aussi canUndo(), index() et canRedo().

[read-only] clean : bool

Cette propriété indique l'état de propreté de la pile.

Cette propriété indique si la pile est propre ou non. Par exemple, une pile est propre lorsqu'un document a été enregistré.

Fonctions d'accès :

bool isClean() const

Signal Notificateur :

void cleanChanged(bool clean)

Voir aussi isClean(), setClean(), resetClean() et cleanIndex().

[read-only] redoText : QString

Cette propriété contient le texte de la prochaine commande à refaire.

Cette propriété contient le texte de la commande qui sera refaite lors du prochain appel à redo().

Fonctions d'accès :

QString redoText() const

Notifier signal :

void redoTextChanged(const QString &redoText)

Voir également redoText(), QUndoCommand::actionText() et undoText().

undoLimit : int

Cette propriété contient le nombre maximum de commandes sur cette pile.

Lorsque le nombre de commandes sur une pile dépasse la limite d'annulation de la pile, les commandes sont supprimées au bas de la pile. Les macro-commandes (commandes avec des commandes enfants) sont traitées comme une seule commande. La valeur par défaut est 0, ce qui signifie qu'il n'y a pas de limite.

Cette propriété ne peut être définie que lorsque la pile d'annulation est vide, car si elle est définie sur une pile non vide, la commande à l'index actuel risque d'être supprimée. L'appel à setUndoLimit() sur une pile non vide affiche un avertissement et ne fait rien.

Fonctions d'accès :

int undoLimit() const
void setUndoLimit(int limit)

[read-only] undoText : QString

Cette propriété contient le texte d'annulation de la prochaine commande annulée.

Cette propriété contient le texte de la commande qui sera annulée lors du prochain appel à undo().

Fonctions d'accès :

QString undoText() const

Notifier signal :

void undoTextChanged(const QString &undoText)

Voir également undoText(), QUndoCommand::actionText() et redoText().

Documentation des fonctions membres

[explicit] QUndoStack::QUndoStack(QObject *parent = nullptr)

Construit une pile d'annulation vide avec le parent parent. La pile sera initialement dans l'état "clean". Si parent est un objet QUndoGroup, la pile est automatiquement ajoutée au groupe.

Voir aussi push().

[virtual noexcept] QUndoStack::~QUndoStack()

Détruit la pile d'annulation, en supprimant toutes les commandes qui s'y trouvent. Si la pile se trouve dans un site QUndoGroup, elle est automatiquement supprimée du groupe.

Voir également QUndoStack().

void QUndoStack::beginMacro(const QString &text)

Commence la composition d'une macro-commande avec la description donnée text.

Une commande vide décrite par la description text est placée sur la pile. Toutes les commandes ultérieures placées sur la pile seront ajoutées aux enfants de la commande vide jusqu'à ce que endMacro() soit appelé.

Les appels à beginMacro() et endMacro() peuvent être imbriqués, mais chaque appel à beginMacro() doit avoir un appel correspondant à endMacro().

Pendant la composition d'une macro, la pile est désactivée. Cela signifie que :

La pile est activée et les signaux appropriés sont émis lorsque endMacro() est appelé pour la macro la plus externe.

stack.beginMacro("insert red text");
stack.push(new InsertText(document, idx, text));
stack.push(new SetColor(document, idx, text.length(), Qt::red));
stack.endMacro(); // indexChanged() is emitted

Ce code est équivalent à :

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

Voir aussi endMacro().

bool QUndoStack::canRedo() const

Renvoie true si une commande est disponible pour être refaite ; sinon, renvoie false.

Cette fonction renvoie false si la pile est vide ou si la commande la plus élevée de la pile a déjà été refaite.

Synonyme de index() == count().

Note : Fonction Getter pour la propriété canRedo.

Voir également index() et canUndo().

[signal] void QUndoStack::canRedoChanged(bool canRedo)

Ce signal est émis lorsque la valeur de canRedo() change. Il est utilisé pour activer ou désactiver l'action de rétablissement renvoyée par createRedoAction(). canRedo spécifie la nouvelle valeur.

Note : Signal de notification pour la propriété canRedo.

bool QUndoStack::canUndo() const

Renvoie true si une commande est disponible pour l'annulation ; sinon, renvoie false.

Cette fonction renvoie false si la pile est vide ou si la dernière commande de la pile a déjà été annulée.

Synonyme de index() == 0.

Note : Fonction d'obtention de la propriété canUndo.

Voir également index() et canRedo().

[signal] void QUndoStack::canUndoChanged(bool canUndo)

Ce signal est émis lorsque la valeur de canUndo() change. Il est utilisé pour activer ou désactiver l'action d'annulation renvoyée par createUndoAction(). canUndo spécifie la nouvelle valeur.

Note : Signal de notification pour la propriété canUndo.

[signal] void QUndoStack::cleanChanged(bool clean)

Ce signal est émis chaque fois que la pile entre ou quitte l'état de propreté. Si clean est vrai, la pile est dans un état propre ; sinon, ce signal indique qu'elle a quitté l'état propre.

Note : Signal de notification pour la propriété clean.

Voir aussi isClean() et setClean().

int QUndoStack::cleanIndex() const

Renvoie l'index propre. Il s'agit de l'index auquel setClean() a été appelé.

Une pile peut ne pas avoir d'index propre. Cela se produit lorsqu'un document est enregistré, que certaines commandes sont annulées et qu'une nouvelle commande est passée. Comme push() supprime toutes les commandes annulées avant de pousser la nouvelle commande, la pile ne peut pas revenir à l'état propre. Dans ce cas, cette fonction renvoie -1. Le -1 peut également être renvoyé après un appel explicite à resetClean().

Voir aussi isClean() et setClean().

void QUndoStack::clear()

Efface la pile de commandes en supprimant toutes les commandes qui s'y trouvent, et ramène la pile à l'état initial.

Les commandes ne sont ni annulées ni refaites ; l'état de l'objet édité reste inchangé.

Cette fonction est généralement utilisée lorsque le contenu du document est abandonné.

Voir également QUndoStack().

const QUndoCommand *QUndoStack::command(int index) const

Renvoie un pointeur constant sur la commande à l'adresse index.

Cette fonction renvoie un pointeur constant, car la modification d'une commande, une fois qu'elle a été placée sur la pile et exécutée, entraîne presque toujours une corruption de l'état du document, si la commande est annulée ou refaite ultérieurement.

Voir aussi QUndoCommand::child().

int QUndoStack::count() const

Renvoie le nombre de commandes sur la pile. Les macro-commandes sont comptées comme une seule commande.

Voir aussi index(), setIndex() et command().

QAction *QUndoStack::createRedoAction(QObject *parent, const QString &prefix = QString()) const

Crée un objet redo QAction avec l'adresse parent donnée.

Le déclenchement de cette action entraînera un appel à redo(). Le texte de cette action est le texte de la commande qui sera refaite lors du prochain appel à redo(), préfixé par le prefix spécifié. Si aucune commande n'est disponible pour être refaite, cette action sera désactivée.

Si prefix est vide, le modèle par défaut "Redo %1" est utilisé à la place du préfixe. Avant Qt 4.8, le préfixe "Redo" était utilisé par défaut.

Voir aussi createUndoAction(), canRedo(), et QUndoCommand::text().

QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix = QString()) const

Crée un objet d'annulation QAction avec l'adresse parent.

Le déclenchement de cette action entraînera un appel à undo(). Le texte de cette action est le texte de la commande qui sera annulée lors du prochain appel à undo(), préfixé par le prefix spécifié. Si aucune commande n'est disponible pour l'annulation, cette action sera désactivée.

Si prefix est vide, le modèle par défaut "Undo %1" est utilisé à la place du préfixe. Avant Qt 4.8, le préfixe "Undo" était utilisé par défaut.

Voir aussi createRedoAction(), canUndo() et QUndoCommand::text().

void QUndoStack::endMacro()

Termine la composition d'une macro-commande.

S'il s'agit de la macro la plus externe d'un ensemble de macros imbriquées, cette fonction émet indexChanged() une fois pour l'ensemble de la macro-commande.

Voir aussi beginMacro().

int QUndoStack::index() const

Renvoie l'index de la commande en cours. Il s'agit de la commande qui sera exécutée lors du prochain appel à redo(). Il ne s'agit pas toujours de la commande la plus élevée sur la pile, car un certain nombre de commandes peuvent avoir été annulées.

Voir aussi setIndex(), undo(), redo() et count().

[signal] void QUndoStack::indexChanged(int idx)

Ce signal est émis lorsqu'une commande modifie l'état du document. Cela se produit lorsqu'une commande est annulée ou refaite. Lorsqu'une macro-commande est annulée ou refaite, ou que setIndex() est appelé, ce signal n'est émis qu'une seule fois.

idx spécifie l'index de la commande courante, c'est-à-dire la commande qui sera exécutée lors du prochain appel à redo().

Voir également index() et setIndex().

bool QUndoStack::isClean() const

Si la pile est dans un état propre, elle renvoie true; sinon, elle renvoie false.

Note : Fonction d'obtention de la propriété clean.

Voir aussi setClean() et cleanIndex().

void QUndoStack::push(QUndoCommand *cmd)

Repousse cmd sur la pile ou le fusionne avec la dernière commande exécutée. Dans les deux cas, il exécute cmd en appelant sa fonction redo().

Si l'id de cmd n'est pas -1 et si l'id est le même que celui de la dernière commande exécutée, QUndoStack tentera de fusionner les deux commandes en appelant QUndoCommand::mergeWith() sur la dernière commande exécutée. Si QUndoCommand::mergeWith() renvoie true, cmd est supprimé.

Après avoir appelé QUndoCommand::redo() et, le cas échéant, QUndoCommand::mergeWith(), QUndoCommand::isObsolete() sera appelé pour cmd ou la commande fusionnée. Si QUndoCommand::isObsolete() renvoie true, alors cmd ou la commande fusionnée sera supprimée de la pile.

Dans tous les autres cas, cmd est simplement poussé sur la pile.

Si des commandes ont été annulées avant que cmd ne soit poussé, la commande en cours et toutes les commandes au-dessus d'elle sont supprimées. C'est pourquoi cmd finit toujours par être la commande la plus élevée de la pile.

Une fois qu'une commande est poussée, la pile en prend possession. Il n'y a pas de getters pour retourner la commande, car la modifier après qu'elle a été exécutée entraînera presque toujours une corruption de l'état du document.

Voir également QUndoCommand::id() et QUndoCommand::mergeWith().

[slot] void QUndoStack::redo()

Refait la commande en cours en appelant QUndoCommand::redo(). Incrémente l'index de la commande en cours.

Si la pile est vide ou si la première commande de la pile a déjà été refaite, cette fonction ne fait rien.

Si QUndoCommand::isObsolete() renvoie un résultat positif pour la commande en cours, celle-ci sera supprimée de la pile. De plus, si l'index de nettoyage est supérieur ou égal à l'index de la commande en cours, l'index de nettoyage est réinitialisé.

Voir également undo() et index().

QString QUndoStack::redoText() const

Renvoie le texte de la commande qui sera refaite lors du prochain appel à redo().

Note : Fonction Getter pour la propriété redoText.

Voir aussi QUndoCommand::actionText() et undoText().

[signal] void QUndoStack::redoTextChanged(const QString &redoText)

Ce signal est émis lorsque la valeur de redoText() change. Il est utilisé pour mettre à jour la propriété text de l'action redo renvoyée par createRedoAction(). redoText spécifie le nouveau texte.

Note : Signal de notification pour la propriété redoText.

[slot] void QUndoStack::resetClean()

Quitte l'état de propreté et émet cleanChanged() si la pile était propre. Cette méthode réinitialise l'index de nettoyage à -1.

Elle est généralement appelée dans les cas suivants, lorsqu'un document a été :

  • créé sur la base d'un modèle et n'a pas été sauvegardé, de sorte qu'aucun nom de fichier n'a encore été associé au document.
  • restauré à partir d'un fichier de sauvegarde
  • a été modifié en dehors de l'éditeur et que l'utilisateur ne l'a pas rechargé.

Voir aussi isClean(), setClean(), et cleanIndex().

[slot] void QUndoStack::setClean()

Marque la pile comme étant propre et émet cleanChanged() si la pile n'était pas déjà propre.

Ce signal est généralement émis lors de l'enregistrement d'un document, par exemple.

Chaque fois que la pile revient à cet état par l'utilisation des commandes undo/redo, elle émet le signal cleanChanged(). Ce signal est également émis lorsque la pile quitte l'état "clean".

Voir également isClean(), resetClean() et cleanIndex().

[slot] void QUndoStack::setIndex(int idx)

Appelle à plusieurs reprises undo() ou redo() jusqu'à ce que l'index de la commande en cours atteigne idx. Cette fonction peut être utilisée pour faire avancer ou reculer l'état du document. indexChanged() n'est émis qu'une seule fois.

Voir également index(), count(), undo() et redo().

QString QUndoStack::text(int idx) const

Renvoie le texte de la commande à l'index idx.

Voir aussi beginMacro().

[slot] void QUndoStack::undo()

Annule la commande située en dessous de la commande actuelle en appelant QUndoCommand::undo(). Diminue l'index de la commande en cours.

Si la pile est vide ou si la commande du bas de la pile a déjà été annulée, cette fonction ne fait rien.

Une fois la commande annulée, si QUndoCommand::isObsolete() renvoie true, la commande sera supprimée de la pile. En outre, si l'indice de nettoyage est supérieur ou égal à l'indice de la commande en cours, l'indice de nettoyage est réinitialisé.

Voir également redo() et index().

QString QUndoStack::undoText() const

Renvoie le texte de la commande qui sera annulée lors du prochain appel à undo().

Note : Fonction Getter pour la propriété undoText.

Voir également QUndoCommand::actionText() et redoText().

[signal] void QUndoStack::undoTextChanged(const QString &undoText)

Ce signal est émis lorsque la valeur de undoText() change. Il est utilisé pour mettre à jour la propriété text de l'action d'annulation renvoyée par createUndoAction(). undoText spécifie le nouveau texte.

Note : Signal de notification pour la propriété undoText.

© 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.