En esta página

QUndoStack Class

La clase QUndoStack es una pila de objetos QUndoCommand. Más...

Cabecera: #include <QUndoStack>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Hereda: QObject

Propiedades

Funciones públicas

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

Ranuras públicas

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

Señales

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)

Descripción Detallada

Para una visión general del Framework de Deshacer de Qt, vea el documento de visión general.

Una pila de deshacer mantiene una pila de comandos que han sido aplicados a un documento.

Los nuevos comandos se introducen en la pila usando push(). Las órdenes pueden deshacerse y rehacerse utilizando undo() y redo(), o activando las acciones devueltas por createUndoAction() y createRedoAction().

QUndoStack realiza un seguimiento del comando current. Este es el comando que será ejecutado por la siguiente llamada a redo(). El índice de este comando es devuelto por index(). El estado del objeto editado puede retroceder o avanzar utilizando setIndex(). Si el comando más alto de la pila ya ha sido rehecho, index() es igual a count().

QUndoStack proporciona soporte para acciones de deshacer y rehacer, compresión de comandos, macros de comandos y soporta el concepto de estado limpio.

Acciones de deshacer y rehacer

QUndoStack proporciona prácticos objetos de deshacer y rehacer QAction, que pueden insertarse en un menú o en una barra de herramientas. Cuando se deshacen o rehacen comandos, QUndoStack actualiza las propiedades de texto de estas acciones para reflejar qué cambio desencadenarán. Las acciones también se desactivan cuando no hay ningún comando disponible para deshacer o rehacer. Estas acciones son devueltas por QUndoStack::createUndoAction() y QUndoStack::createRedoAction().

Compresión de comandos y macros

La compresión de comandos es útil cuando varios comandos pueden comprimirse en un único comando que puede deshacerse y rehacerse en una sola operación. Por ejemplo, cuando un usuario escribe un carácter en un editor de texto, se crea un nuevo comando. Este comando inserta el carácter en el documento en la posición del cursor. Sin embargo, es más cómodo para el usuario poder deshacer o rehacer la escritura de palabras, frases o párrafos enteros. La compresión de comandos permite fusionar estos comandos de un solo carácter en un único comando que inserta o borra secciones de texto. Para obtener más información, consulte QUndoCommand::mergeWith() y push().

Una macro de comandos es una secuencia de comandos que se deshacen y rehacen de una sola vez. Las macros de comandos se crean dando a un comando una lista de comandos hijos. Al deshacer o rehacer el comando padre se deshacen o rehacen los comandos hijos. Las macros de comandos pueden crearse explícitamente especificando un padre en el constructor QUndoCommand, o utilizando las funciones de conveniencia beginMacro() y endMacro().

Aunque la compresión de comandos y las macros parecen tener el mismo efecto para el usuario, a menudo tienen usos diferentes en una aplicación. Los comandos que realizan pequeños cambios en un documento pueden comprimirse de forma útil si no hay necesidad de registrarlos individualmente, y si sólo los cambios más grandes son relevantes para el usuario. Sin embargo, para los comandos que deben registrarse individualmente, o los que no pueden comprimirse, es útil utilizar macros para proporcionar una experiencia de usuario más cómoda a la vez que se mantiene un registro de cada comando.

Estado limpio

QUndoStack admite el concepto de estado limpio. Cuando el documento se guarda en el disco, la pila puede marcarse como limpia utilizando setClean(). Cada vez que la pila vuelve a este estado deshaciendo y rehaciendo comandos, emite la señal cleanChanged(). Esta señal también se emite cuando la pila abandona el estado limpio. Esta señal se utiliza normalmente para activar y desactivar las acciones de guardar en la aplicación, y para actualizar el título del documento para reflejar que contiene cambios sin guardar.

Comandos obsoletos

QUndoStack es capaz de borrar comandos de la pila si el comando ya no es necesario. Un ejemplo puede ser borrar un comando cuando dos comandos se fusionan de tal manera que el comando fusionado no tiene ninguna función. Esto puede verse con comandos de movimiento en los que el usuario mueve el ratón a una parte de la pantalla y luego lo mueve a la posición original. El comando fusionado resulta en un movimiento del ratón de 0. Este comando puede ser eliminado ya que no sirve para nada. Otro ejemplo son los comandos de red que fallan debido a problemas de conexión. En este caso, el comando debe ser eliminado de la pila porque las funciones redo() y undo() no tienen ninguna función ya que hubo problemas de conexión.

Un comando puede marcarse como obsoleto con la función QUndoCommand::setObsolete(). La bandera QUndoCommand::isObsolete() se comprueba en QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo() y QUndoStack::setIndex() después de llamar a QUndoCommand::undo(), QUndoCommand::redo() y QUndoCommand:mergeWith() cuando corresponda.

Si un comando se establece como obsoleto y el índice limpio es mayor o igual que el índice del comando actual, entonces el índice limpio se restablecerá cuando el comando se elimine de la pila.

Véase también QUndoCommand y QUndoView.

Documentación de propiedades

active : bool

Esta propiedad contiene el estado activo de esta pila.

Una aplicación suele tener varias pilas de deshacer, una por cada documento abierto. La pila activa es la asociada con el documento actualmente activo. Si la pila pertenece a un QUndoGroup, las llamadas a QUndoGroup::undo() o QUndoGroup::redo() serán reenviadas a esta pila cuando esté activa. Si el QUndoGroup está vigilado por un QUndoView, la vista mostrará el contenido de esta pila cuando esté activa. Si la pila no pertenece a un QUndoGroup, activarla no tiene ningún efecto.

Es responsabilidad del programador especificar qué pila está activa llamando a setActive(), normalmente cuando la ventana del documento asociado recibe el foco.

Funciones de acceso:

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

Véase también QUndoGroup.

[read-only] canRedo : bool

Esta propiedad indica si esta pila puede rehacerse.

Esta propiedad indica si existe o no un comando que pueda rehacerse.

Funciones de acceso:

bool canRedo() const

Señal de notificador:

void canRedoChanged(bool canRedo)

Véase también canRedo(), index(), y canUndo().

[read-only] canUndo : bool

Esta propiedad indica si esta pila puede deshacerse.

Esta propiedad indica si existe o no un comando que se pueda deshacer.

Funciones de acceso:

bool canUndo() const

Señal de notificador:

void canUndoChanged(bool canUndo)

Véase también canUndo(), index(), y canRedo().

[read-only] clean : bool

Esta propiedad contiene el estado de limpieza de esta pila.

Esta propiedad indica si la pila está limpia o no. Por ejemplo, una pila está limpia cuando se ha guardado un documento.

Funciones de acceso:

bool isClean() const

Señal de notificador:

void cleanChanged(bool clean)

Véase también isClean(), setClean(), resetClean(), y cleanIndex().

[read-only] redoText : QString

Esta propiedad contiene el texto de rehacer de la siguiente orden que se rehace.

Esta propiedad contiene el texto de la orden que se rehará en la siguiente llamada a redo().

Funciones de acceso:

QString redoText() const

Señal de notificador:

void redoTextChanged(const QString &redoText)

Véase también redoText(), QUndoCommand::actionText(), y undoText().

undoLimit : int

Esta propiedad contiene el número máximo de comandos en esta pila.

Cuando el número de comandos de una pila supera el límite de deshacer de la pila, los comandos se eliminan de la parte inferior de la pila. Los macrocomandos (comandos con comandos hijos) se tratan como un solo comando. El valor por defecto es 0, lo que significa que no hay límite.

Esta propiedad sólo puede establecerse cuando la pila de deshacer está vacía, ya que establecerla en una pila no vacía podría borrar el comando en el índice actual. Llamar a setUndoLimit() en una pila no vacía imprime una advertencia y no hace nada.

Funciones de acceso:

int undoLimit() const
void setUndoLimit(int limit)

[read-only] undoText : QString

Esta propiedad contiene el texto de deshacer del siguiente comando que se deshace.

Esta propiedad contiene el texto del comando que se deshará en la siguiente llamada a undo().

Funciones de acceso:

QString undoText() const

Señal de notificador:

void undoTextChanged(const QString &undoText)

Véase también undoText(), QUndoCommand::actionText(), y redoText().

Documentación de las funciones miembro

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

Construye una pila de deshacer vacía con el padre parent. La pila estará inicialmente en estado limpio. Si parent es un objeto QUndoGroup, la pila se añade automáticamente al grupo.

Véase también push().

[virtual noexcept] QUndoStack::~QUndoStack()

Destruye la pila de deshacer, borrando cualquier orden que se encuentre en ella. Si la pila está en QUndoGroup, la pila se elimina automáticamente del grupo.

Véase también QUndoStack().

void QUndoStack::beginMacro(const QString &text)

Inicia la composición de un macrocomando con la descripción dada en text.

Se coloca en la pila un comando vacío descrito por el text especificado. Cualquier comando posterior que se introduzca en la pila se añadirá a los hijos del comando vacío hasta que se llame a endMacro().

Las llamadas a beginMacro() y endMacro() pueden estar anidadas, pero cada llamada a beginMacro() debe tener una llamada a endMacro().

Mientras se compone una macro, la pila está desactivada. Esto significa que:

La pila se habilita y se emiten las señales apropiadas cuando se llama a endMacro() para la macro más externa.

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

Este código es equivalente a:

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

Véase también endMacro().

bool QUndoStack::canRedo() const

Devuelve true si hay una orden disponible para rehacer; en caso contrario devuelve false.

Esta función devuelve false si la pila está vacía o si el comando superior de la pila ya ha sido rehecho.

Sinónimo de index() == count().

Nota: Función Getter para la propiedad canRedo.

Véase también index() y canUndo().

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

Esta señal se emite cada vez que cambia el valor de canRedo(). Se utiliza para activar o desactivar la acción de rehacer devuelta por createRedoAction(). canRedo especifica el nuevo valor.

Nota: Señal notificadora para la propiedad canRedo.

bool QUndoStack::canUndo() const

Devuelve true si hay una orden disponible para deshacer; en caso contrario devuelve false.

Esta función devuelve false si la pila está vacía, o si el comando inferior de la pila ya ha sido deshecho.

Sinónimo de index() == 0.

Nota: Función Getter para la propiedad canUndo.

Véase también index() y canRedo().

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

Esta señal se emite cada vez que cambia el valor de canUndo(). Se utiliza para activar o desactivar la acción de deshacer devuelta por createUndoAction(). canUndo especifica el nuevo valor.

Nota: Señal notificadora para la propiedad canUndo.

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

Esta señal se emite cada vez que la pila entra o sale del estado limpio. Si clean es verdadero, la pila está en estado limpio; en caso contrario, esta señal indica que ha salido del estado limpio.

Nota: Señal notificadora de la propiedad clean.

Véase también isClean() y setClean().

int QUndoStack::cleanIndex() const

Devuelve el índice limpio. Es el índice en el que se llamó a setClean().

Una pila puede no tener un índice limpio. Esto ocurre si se guarda un documento, se deshacen algunos comandos y luego se introduce un nuevo comando. Dado que push() borra todos los comandos deshechos antes de introducir el nuevo comando, la pila no puede volver al estado limpio de nuevo. En este caso, esta función devuelve -1. El -1 también puede ser devuelto después de una llamada explícita a resetClean().

Véase también isClean() y setClean().

void QUndoStack::clear()

Borra la pila de comandos eliminando todos los comandos que contiene y devuelve la pila al estado limpio.

Los comandos no se deshacen ni se rehacen; el estado del objeto editado permanece inalterado.

Esta función suele utilizarse cuando se abandona el contenido del documento.

Véase también QUndoStack().

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

Devuelve un puntero constante a la orden en index.

Esta función devuelve un puntero constante, porque la modificación de un comando, una vez que ha sido introducido en la pila y ejecutado, casi siempre causa la corrupción del estado del documento, si el comando se deshace o rehace más tarde.

Véase también QUndoCommand::child().

int QUndoStack::count() const

Devuelve el número de comandos en la pila. Los macrocomandos se cuentan como un comando.

Véase también index(), setIndex() y command().

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

Crea un objeto redo QAction con el valor dado parent.

La activación de esta acción provocará una llamada a redo(). El texto de esta acción es el texto del comando que se rehará en la siguiente llamada a redo(), prefijado por el prefix especificado. Si no hay ninguna orden disponible para rehacer, esta acción se desactivará.

Si prefix está vacío, se utilizará la plantilla por defecto "Redo %1" en lugar del prefijo. Antes de Qt 4.8, se utilizaba por defecto el prefijo "Redo".

Véase también createUndoAction(), canRedo(), y QUndoCommand::text().

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

Crea un objeto deshacer QAction con el valor dado parent.

La activación de esta acción provocará una llamada a undo(). El texto de esta acción es el texto del comando que se deshará en la siguiente llamada a undo(), prefijado por el prefix especificado. Si no hay ninguna orden disponible para deshacer, esta acción se desactivará.

Si prefix está vacío, se utilizará la plantilla por defecto "Deshacer %1" en lugar del prefijo. Antes de Qt 4.8, se utilizaba por defecto el prefijo "Deshacer".

Véase también createRedoAction(), canUndo(), y QUndoCommand::text().

void QUndoStack::endMacro()

Finaliza la composición de un macrocomando.

Si ésta es la macro más externa de un conjunto de macros anidadas, esta función emite indexChanged() una vez para todo el macrocomando.

Véase también beginMacro().

int QUndoStack::index() const

Devuelve el índice del comando actual. Este es el comando que se ejecutará en la siguiente llamada a redo(). No siempre es la orden más alta de la pila, ya que pueden haberse deshecho varias órdenes.

Véase también setIndex(), undo(), redo() y count().

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

Esta señal se emite cada vez que un comando modifica el estado del documento. Esto ocurre cuando se deshace o rehace un comando. Cuando se deshace o rehace un macrocomando, o se llama a setIndex(), esta señal sólo se emite una vez.

idx especifica el índice del comando actual, es decir, el comando que se ejecutará en la siguiente llamada a redo().

Véase también index() y setIndex().

bool QUndoStack::isClean() const

Si la pila está en estado limpio, devuelve true; en caso contrario devuelve false.

Nota: Función Getter para la propiedad clean.

Véase también setClean() y cleanIndex().

void QUndoStack::push(QUndoCommand *cmd)

Coloca cmd en la pila o lo combina con el comando ejecutado más recientemente. En cualquier caso, ejecuta cmd llamando a su función redo().

Si el id de cmd no es -1, y si el id es el mismo que el del comando ejecutado más recientemente, QUndoStack intentará fusionar los dos comandos llamando a QUndoCommand::mergeWith() en el comando ejecutado más recientemente. Si QUndoCommand::mergeWith() devuelve true, se elimina cmd.

Después de llamar a QUndoCommand::redo() y, si corresponde, a QUndoCommand::mergeWith(), se llamará a QUndoCommand::isObsolete() para cmd o el comando fusionado. Si QUndoCommand::isObsolete() devuelve true, entonces cmd o el comando fusionado serán borrados de la pila.

En todos los demás casos, cmd simplemente se coloca en la pila.

Si los comandos se deshicieron antes de que cmd fuera empujado, el comando actual y todos los comandos por encima de él se eliminan. Por lo tanto, cmd siempre termina siendo el primero de la pila.

Una vez que se ha introducido una orden, la pila toma posesión de ella. No hay getters para devolver el comando, ya que modificarlo después de que se haya ejecutado casi siempre provocará la corrupción del estado del documento.

Véase también QUndoCommand::id() y QUndoCommand::mergeWith().

[slot] void QUndoStack::redo()

Rehace el comando actual llamando a QUndoCommand::redo(). Incrementa el índice del comando actual.

Si la pila está vacía, o si el comando superior de la pila ya ha sido rehecho, esta función no hace nada.

Si QUndoCommand::isObsolete() devuelve verdadero para el comando actual, entonces el comando será borrado de la pila. Además, si el índice de limpieza es mayor o igual que el índice del comando actual, entonces se restablece el índice de limpieza.

Véase también undo() y index().

QString QUndoStack::redoText() const

Devuelve el texto del comando que será rehecho en la próxima llamada a redo().

Nota: Función Getter para la propiedad redoText.

Véase también QUndoCommand::actionText() y undoText().

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

Esta señal se emite cada vez que cambia el valor de redoText(). Se utiliza para actualizar la propiedad text de la acción de rehacer devuelta por createRedoAction(). redoText especifica el nuevo texto.

Nota: Señal notificadora para la propiedad redoText.

[slot] void QUndoStack::resetClean()

Deja el estado limpio y emite cleanChanged() si la pila estaba limpia. Este método restablece el índice clean a -1.

Esto se llama típicamente en los siguientes casos, cuando un documento ha sido:

  • creado basándose en alguna plantilla y no se ha guardado, por lo que aún no se ha asociado ningún nombre de archivo al documento.
  • restaurado desde un archivo de copia de seguridad.
  • modificado fuera del editor y el usuario no lo ha vuelto a cargar.

Véase también isClean(), setClean(), y cleanIndex().

[slot] void QUndoStack::setClean()

Marca la pila como limpia y emite cleanChanged() si la pila no estaba ya limpia.

Esto se hace normalmente cuando se guarda un documento, por ejemplo.

Cada vez que la pila vuelve a este estado mediante el uso de comandos de deshacer/rehacer, emite la señal cleanChanged(). Esta señal también se emite cuando la pila abandona el estado limpio.

Véase también isClean(), resetClean() y cleanIndex().

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

Llama repetidamente a undo() o redo() hasta que el índice del comando actual alcanza idx. Esta función puede utilizarse para hacer avanzar o retroceder el estado del documento. indexChanged() sólo se emite una vez.

Véase también index(), count(), undo() y redo().

QString QUndoStack::text(int idx) const

Devuelve el texto del comando en el índice idx.

Véase también beginMacro().

[slot] void QUndoStack::undo()

Deshace el comando por debajo del comando actual llamando a QUndoCommand::undo(). Disminuye el índice del comando actual.

Si la pila está vacía, o si el comando inferior de la pila ya se ha deshecho, esta función no hace nada.

Después de deshacer el comando, si QUndoCommand::isObsolete() devuelve true, entonces el comando se borrará de la pila. Además, si el índice limpio es mayor o igual que el índice del comando actual, entonces se restablece el índice limpio.

Véase también redo() y index().

QString QUndoStack::undoText() const

Devuelve el texto del comando que será deshecho en la próxima llamada a undo().

Nota: Función Getter para la propiedad undoText.

Véase también QUndoCommand::actionText() y redoText().

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

Esta señal se emite cada vez que cambia el valor de undoText(). Se utiliza para actualizar la propiedad text de la acción de deshacer devuelta por createUndoAction(). undoText especifica el nuevo texto.

Nota: Señal notificadora para la propiedad 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.