Sur cette page

QUndoStack Class

La classe QUndoStack est une pile d'objets de type « QUndoCommand ». En savoir plus...

En-tête : #include <QUndoStack>
CMake : find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake : QT += gui
Hérite de : 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 présentation générale du framework « Undo » de Qt, consultez le document de présentation.

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

Les nouvelles commandes sont ajoutées à la pile à l'aide de la fonction ` push()`. Les commandes peuvent être annulées ou rétablies à l'aide des fonctions ` undo()` et ` redo()`, ou en déclenchant les actions renvoyées par les fonctions ` 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é à l'aide de setIndex(). Si la commande située tout en haut de la pile a déjà été réitérée, index() est égal à count().

QUndoStack prend en charge les actions d’annulation et de réexécution, la compression des commandes, les macros de commande, ainsi que le concept d’ état « propre ».

Actions d’annulation et de rétablissement

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

Compression des commandes et macros

La compression des commandes est utile lorsque plusieurs commandes peuvent être regroupées en une seule commande pouvant être annulée ou rétablie en une seule opération. Par exemple, lorsqu’un utilisateur saisit 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. Cependant, il est plus pratique pour l’utilisateur de pouvoir annuler ou rétablir la saisie de mots entiers, de phrases ou de paragraphes. La compression des commandes permet de regrouper ces commandes à caractère unique en une seule commande qui insère ou supprime des sections de texte. Pour plus d’informations, consultez QUndoCommand::mergeWith() et push().

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

Bien que la compression des commandes et les macros semblent avoir le même effet pour l’utilisateur, elles ont souvent des utilisations différentes au sein d’une application. Les commandes qui effectuent de petites modifications sur 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 présentent un intérêt pour l’utilisateur. En revanche, pour les commandes qui doivent être enregistrées individuellement, ou celles qui ne peuvent pas être compressées, il est utile de recourir à des macros afin d’offrir une expérience utilisateur plus pratique tout en conservant une trace 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 la fonction setClean(). Chaque fois que la pile revient à cet état suite à des commandes d’annulation et de rétablissement, elle émet le signal ` cleanChanged()`. Ce signal est également émis lorsque la pile quitte l’état « propre ». Ce signal est généralement utilisé pour activer et désactiver les actions d’enregistrement dans l’application, et pour mettre à jour le titre du document afin d’indiquer qu’il contient des modifications non enregistrées.

Commandes obsolètes

QUndoStack est capable de supprimer des commandes de la pile si celles-ci ne sont plus nécessaires. 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 aucune fonction. On peut observer ce phénomène avec les commandes de déplacement où l’utilisateur déplace sa souris vers une partie de l’écran puis la ramène à sa position d’origine. La commande fusionnée se traduit par un déplacement de souris égal à 0. Cette commande peut être supprimée puisqu’elle ne sert à rien. Un autre exemple concerne les commandes réseau qui échouent en raison de problèmes de connexion. Dans ce cas, la commande doit être retiré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 à l’aide de la fonction QUndoCommand::setObsolete(). L’indicateur QUndoCommand::isObsolete() est vérifié dans les fonctions QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo() et QUndoStack::setIndex() après l’appel des fonctions QUndoCommand::undo(), QUndoCommand::redo() et QUndoCommand:mergeWith(), le cas échéant.

Si une commande est marquée comme obsolète et que l’index « clean » est supérieur ou égal à l’index actuel de la commande, alors l’index « clean » 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 si cette pile est active.

Une application dispose souvent de plusieurs piles d’annulation, une pour chaque document ouvert. La pile active est celle associée au document actuellement actif. Si la pile appartient à un « QUndoGroup », les appels à ` QUndoGroup::undo()` ou ` QUndoGroup::redo()` seront redirigés vers cette pile lorsqu’elle est active. Si l’ QUndoGroup est surveillée par une QUndoView, la vue affichera le contenu de cette pile lorsqu’elle sera active. Si la pile n’appartient pas à une QUndoGroup, le fait de la rendre active n’aura aucun effet.

Il incombe au programmeur de spécifier quelle pile est active en appelant la fonction setActive(), généralement lorsque la fenêtre du document associé 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 permet de revenir en arrière.

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

Fonctions d'accès :

bool canRedo() const

Signal de notification :

void canRedoChanged(bool canRedo)

Voir également canRedo(), index() et canUndo().

[read-only] canUndo : bool

Cette propriété indique si cette pile permet d'annuler une action.

Cette propriété indique s'il existe ou non une commande pouvant être annulée.

Fonctions d'accès :

bool canUndo() const

Signal de notification :

void canUndoChanged(bool canUndo)

Voir également canUndo(), index() et canRedo().

[read-only] clean : bool

Cette propriété indique si la pile est « propre ».

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 de notification :

void cleanChanged(bool clean)

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

[read-only] redoText : QString

Cette propriété contient le texte de la commande suivante qui sera réitérée.

Cette propriété contient le texte de la commande qui sera réitérée lors du prochain appel à la fonction ` redo()`.

Fonctions d'accès :

QString redoText() const

Signal de notification :

void redoTextChanged(const QString &redoText)

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

undoLimit : int

Cette propriété détermine le nombre maximal de commandes présentes dans cette pile.

Lorsque le nombre de commandes dans une pile dépasse la valeur undoLimit de celle-ci, les commandes sont supprimées à partir du bas de la pile. Les commandes macro (commandes comportant des sous-commandes) sont considéré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 la définir sur une pile non vide pourrait supprimer la commande située à l'index actuel. L'appel de la fonction `setUndoLimit()` sur une pile non vide affiche un avertissement et n'a aucun effet.

Fonctions d’accès :

int undoLimit() const
void setUndoLimit(int limit)

[read-only] undoText : QString

Cette propriété contient le texte de la commande qui sera annulée lors de la prochaine annulation.

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

Fonctions d’accès :

QString undoText() const

Signal de notification :

void undoTextChanged(const QString &undoText)

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

Documentation des fonctions membres

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

Crée une pile d'annulation vide avec l'parent parent. La pile sera initialement à l'état « clean ». Si parent est un objet QUndoGroup, la pile est automatiquement ajoutée au groupe.

Voir également push().

[virtual noexcept] QUndoStack::~QUndoStack()

Supprime la pile d'annulation, en effaçant toutes les commandes qu'elle contient. Si la pile se trouve dans un « QUndoGroup », elle est automatiquement retirée de ce groupe.

Voir aussi QUndoStack().

void QUndoStack::beginMacro(const QString &text)

Lance la création d'une commande macro avec la description d'text s fournie.

Une commande vide décrite par l’ text spécifiée est placée sur la pile. Toutes les commandes suivantes placées sur la pile seront ajoutées aux enfants de la commande vide jusqu’à ce que la fonction endMacro() soit appelée.

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

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

La pile est réactivée et les signaux appropriés sont émis lorsque la fonction ` endMacro()` est appelée 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 » s'il existe une commande pouvant être refaite ; sinon, renvoie « false ».

Cette fonction renvoie « false » si la pile est vide ou si la commande située en haut de la pile a déjà été réitérée.

Synonyme de ` index()` == ` count()`.

Remarque : fonctionde lecture pour la propriété canRedo.

Voir également index() et canUndo().

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

Ce signal est émis chaque fois que la valeur de ` canRedo()` change. Il sert à activer ou désactiver l'action de réexécution renvoyée par ` createRedoAction()`. ` canRedo ` spécifie la nouvelle valeur.

Remarque : signalde notification pour la propriété canRedo.

bool QUndoStack::canUndo() const

Renvoie « true » s'il existe une commande pouvant être annulée ; sinon, renvoie « false ».

Cette fonction renvoie false si la pile est vide ou si la commande située au bas de la pile a déjà été annulée.

Synonyme de ` index() == 0`.

Remarque : fonctionde lecture pour la propriété canUndo.

Voir également index() et canRedo().

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

Ce signal est émis chaque fois que la valeur de ` canUndo()` change. Il sert à activer ou désactiver l'action d'annulation renvoyée par ` createUndoAction()`. ` canUndo ` spécifie la nouvelle valeur.

Remarque : signalde notification pour la propriété canUndo.

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

Ce signal est émis chaque fois que la pile entre dans l'état « propre » ou en sort. Si la propriété clean est vraie, la pile est dans un état « propre » ; dans le cas contraire, ce signal indique qu'elle a quitté cet état.

Remarque : signalde notification pour la propriété clean.

Voir également isClean() et setClean().

int QUndoStack::cleanIndex() const

Renvoie l’index « propre ». Il s’agit de l’index auquel la fonction setClean() a été appelée.

Une pile peut ne pas avoir d'index « propre ». Cela se produit si un document est enregistré, que certaines commandes sont annulées, puis qu'une nouvelle commande est ajoutée à la pile. Étant donné que la fonction push() supprime toutes les commandes annulées avant d'ajouter la nouvelle commande, la pile ne peut plus revenir à son état « propre ». Dans ce cas, cette fonction renvoie -1. La valeur -1 peut également être renvoyée après un appel explicite à resetClean().

Voir également ` isClean()` et ` setClean()`.

void QUndoStack::clear()

Efface la pile de commandes en supprimant toutes les commandes qu'elle contient, et ramène la pile à son état initial.

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

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

Voir aussi QUndoStack().

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

Renvoie un pointeur const vers la commande à l'adresse index.

Cette fonction renvoie un pointeur const, 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 ensuite annulée ou rétablie.

Voir également QUndoCommand::child().

int QUndoStack::count() const

Renvoie le nombre de commandes présentes dans la pile. Les commandes macro sont comptées comme une seule commande.

Voir également index(), setIndex() et command().

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

Crée un objet « redo » de type « QAction » avec l'parent spécifiée.

Le déclenchement de cette action entraînera l'appel de la fonction redo(). Le texte de cette action correspond au texte de la commande qui sera réitérée lors du prochain appel à redo(), préfixé par le préfixe spécifié prefix. S'il n'y a aucune commande disponible à réitérer, cette action sera désactivée.

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

Voir également createUndoAction(), canRedo() et QUndoCommand::text().

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

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

Le déclenchement de cette action entraînera l'appel de la fonction undo(). Le texte de cette action correspond au texte de la commande qui sera annulée lors du prochain appel de undo(), précédé du préfixe spécifié prefix. S'il n'y a aucune commande disponible à annuler, 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 également createRedoAction(), canUndo() et QUndoCommand::text().

void QUndoStack::endMacro()

Mette fin à la composition d'une commande macro.

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

Voir également beginMacro().

int QUndoStack::index() const

Renvoie l'index de la commande actuelle. Il s'agit de la commande qui sera exécutée lors du prochain appel à la fonction redo(). Ce n'est pas toujours la commande située tout en haut de la pile, car certaines commandes ont pu être annulées.

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

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

Ce signal est émis chaque fois qu’une commande modifie l’état du document. Cela se produit lorsqu’une commande est annulée ou rétablie. Lorsqu’une commande de macro est annulée ou rétablie, ou lorsque la fonction ` setIndex()` est appelée, ce signal n’est émis qu’une seule fois.

idx Spécifie l'index de la commande actuelle, 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 à l'état « clean », renvoie true; sinon, renvoie false.

Remarque : fonctionde lecture pour la propriété clean.

Voir également setClean() et cleanIndex().

void QUndoStack::push(QUndoCommand *cmd)

Ajoute cmd à la pile ou la fusionne avec la commande exécutée le plus récemment. Dans les deux cas, exécute cmd en appelant sa fonction redo().

Si l’identifiant de ` cmd` n’est pas -1, et si cet identifiant est identique à celui de la commande exécutée en dernier, ` QUndoStack ` tentera de fusionner les deux commandes en appelant ` QUndoCommand::mergeWith()` sur la commande exécutée en dernier. 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 ajouté à la pile.

Si des commandes ont été annulées avant que cmd ne soit poussée, la commande actuelle et toutes les commandes situées au-dessus d’elle sont supprimées. Par conséquent, cmd se retrouve toujours en tête de la pile.

Une fois qu’une commande est placée sur la pile, celle-ci en prend possession. Il n’existe pas de méthode d’accès permettant de récupérer la commande, car la modifier après son exécution entraînerait presque toujours une corruption de l’état du document.

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

[slot] void QUndoStack::redo()

Répète la commande actuelle en appelant la fonction ` QUndoCommand::redo()`. Incrémente l'index de la commande actuelle.

Si la pile est vide, ou si la commande située en haut de la pile a déjà été réitérée, cette fonction ne fait rien.

Si la fonction ` QUndoCommand::isObsolete()` renvoie `true` pour la commande en cours, celle-ci est 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 réitérée lors du prochain appel à la fonction ` redo()`.

Remarque : fonctiongetter pour la propriété redoText.

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

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

Ce signal est émis chaque fois que la valeur de ` redoText()` change. Il sert à mettre à jour la propriété « text » de l'action de rétablissement renvoyée par ` createRedoAction()`. ` redoText ` spécifie le nouveau texte.

Remarque : signalde notification pour la propriété redoText.

[slot] void QUndoStack::resetClean()

Quitte l'état « clean » et renvoie ` cleanChanged()` si la pile était « clean ». Cette méthode réinitialise l'index « clean » à -1.

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

  • créé à partir d'un modèle et n'a pas encore été enregistré, de sorte qu'aucun nom de fichier ne lui a encore été attribué ;
  • restauré à partir d’un fichier de sauvegarde ;
  • modifié en dehors de l'éditeur et que l'utilisateur ne l'a pas rechargé.

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

[slot] void QUndoStack::setClean()

Marque la pile comme étant « propre » et appelle la fonction ` cleanChanged()` si la pile ne l'était pas déjà.

Cette fonction est généralement appelée lors de l'enregistrement d'un document, par exemple.

Chaque fois que la pile revient à cet état à la suite de l’utilisation des commandes « Annuler »/« Rétablir », elle émet le signal cleanChanged(). Ce signal est également émis lorsque la pile quitte l’état « propre ».

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

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

Appelle de manière répétée undo() ou redo() jusqu’à ce que l’index de commande actuel atteigne idx. Cette fonction peut être utilisée pour faire défiler l’état du document vers l’avant ou vers l’arrière. indexChanged() n’est émise 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 juste en dessous de la commande actuelle en appelant la fonction ` QUndoCommand::undo()`. Décrémente l'index de la commande actuelle.

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

Une fois la commande annulée, si la fonction ` QUndoCommand::isObsolete()` renvoie ` true`, la commande est supprimée de la pile. De plus, si l’index de nettoyage est supérieur ou égal à l’index de la commande actuelle, l’index 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 à la fonction ` undo()`.

Remarque : fonctionde lecture de la propriété undoText.

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

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

Ce signal est émis chaque fois que la valeur de ` undoText()` change. Il sert à mettre à jour la propriété « text » de l'action d'annulation renvoyée par ` createUndoAction()`. ` undoText ` spécifie le nouveau texte.

Remarque : signalde 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.