Класс QUndoStack
Класс QUndoStack представляет собой стек объектов QUndoCommand. Подробнее...
| Заголовок: | #include <QUndoStack> |
| qmake: | QT += widgets |
| С момента: | Qt 4.2 |
| Наследует: | QObject |
Этот класс был представлен в Qt 4.2.
Свойства
Открытые функции
| 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 |
Открытые слоты
| void | redo() |
| void | resetClean() |
| void | setActive(bool active = true) |
| void | setClean() |
| void | setIndex(int idx) |
| void | undo() |
Сигналы
| 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) |
Подробное описание
Для обзора механизма отмены Qt, см. документ обзора.
Стек отмены сохраняет стек команд, которые были применены к документу.
Новые команды добавляются в стек с помощью push(). Команды можно отменять и повторять с помощью undo() и redo(), или вызвав действия, возвращаемые createUndoAction() и createRedoAction().
QUndoStack отслеживает текущую команду. Это команда, которая будет выполнена при следующем вызове redo(). Индекс этой команды возвращается методом index(). Состояние изменённого объекта можно отмотать вперёд или назад с помощью setIndex(). Если самая верхняя команда в стеке уже была повторена, index() равен count().
QUndoStack поддерживает действия отмены и повтора, сжатие команд, макросы команд и поддерживает концепцию чистого состояния.
Действия отмены и повтора
QUndoStack предоставляет удобные объекты QAction для отмены и повтора, которые можно вставить в меню или панель инструментов. Когда команды отменяются или повторяются, QUndoStack обновляет свойства текста этих действий, чтобы отразить вызываемое изменение. Действия также отключаются, когда нет доступных команд для отмены или повтора. Эти действия возвращаются методами QUndoStack::createUndoAction() и QUndoStack::createRedoAction().
Сжатие команд и макросы
Сжатие команд полезно, когда несколько команд можно сжать в одну команду, которая может быть отменена и повторена за одну операцию. Например, когда пользователь вводит символ в текстовом редакторе, создаётся новая команда. Эта команда вставляет символ в документ в позиции курсора. Однако для пользователя удобнее иметь возможность отменить или повторить ввод целых слов, предложений или абзацев. Сжатие команд позволяет объединить команды ввода отдельных символов в одну команду, которая вставляет или удаляет фрагменты текста. Для получения дополнительной информации см. QUndoCommand::mergeWith() и push().
Макрос команды — это последовательность команд, которые все отменяются и повторяются разом. Макросы команд создаются путём задания списку команд родительской команды. Отмена или повторение родительской команды приведёт к отмене или повторению дочерних команд. Макросы команд могут быть созданы явно, указав родительскую команду в конструкторе QUndoCommand, или с помощью удобных функций beginMacro() и endMacro().
Хотя сжатие команд и макросы кажутся одинаковыми для пользователя, они часто используются в приложении по-разному. Команды, которые выполняют небольшие изменения в документе, могут быть сжаты, если нет необходимости записывать их индивидуально, и если для пользователя важны только более крупные изменения. Однако для команд, которые должны записываться индивидуально, или для тех, которые нельзя сжать, полезно использовать макросы для обеспечения более удобного пользовательского опыта, сохраняя при этом запись каждой команды.
Чистое состояние
QUndoStack поддерживает концепцию чистого состояния. При сохранении документа на диск, стек можно пометить как чистый, используя setClean(). Всякий раз, когда стек возвращается в это состояние через отмену и повтор команд, он испускает сигнал cleanChanged(). Этот сигнал также испускается, когда стек покидает чистое состояние. Этот сигнал обычно используется для включения и выключения действий сохранения в приложении и для обновления заголовка документа, чтобы отразить, что он содержит несохраненные изменения.
Устаревшие команды
QUndoStack способен удалять команды из стека, если команда больше не нужна. Одним примером может быть удаление команды, когда две команды объединены таким образом, что объединенная команда не выполняет никакой функции. Это можно увидеть с командами перемещения, когда пользователь перемещает курсор на одну часть экрана, а затем возвращает его в исходное положение. Объединенная команда приводит к перемещению мыши на 0. Эту команду можно удалить, так как она не выполняет никакой функции. Другим примером являются команды сети, которые завершаются ошибкой из-за проблем с подключением. В этом случае команда должна быть удалена из стека, потому что функции redo() и undo() не выполняют никаких действий, так как были проблемы с подключением.
Команду можно пометить как устаревшую с помощью функции QUndoCommand::setObsolete(). Флаг QUndoCommand::isObsolete() проверяется в QUndoStack::push(), QUndoStack::undo(), QUndoStack::redo() и QUndoStack::setIndex() после вызова QUndoCommand::undo(), QUndoCommand::redo() и QUndoCommand:mergeWith(), где применимо.
Если команда помечена как устаревшая, а индекс чистого состояния больше или равен текущему индексу команды, то индекс чистого состояния будет сброшен, когда команда будет удалена из стека.
См. также QUndoCommand и QUndoView.
Документация по свойствам
active : bool
Это свойство хранит активное состояние этого стека.
Приложение часто имеет несколько стеков отмены, по одному на каждый открытый документ. Активный стек связан с текущим активным документом. Если стек принадлежит QUndoGroup, вызовы QUndoGroup::undo() или QUndoGroup::redo() будут перенаправлены на этот стек, когда он активен. Если QUndoGroup просматривается QUndoView, представление отобразит содержимое этого стека, когда он активен. Если стек не принадлежит QUndoGroup, активация стека не окажет никакого влияния.
Программист несет ответственность за указание активного стека, вызывая setActive(), обычно когда ассоциированное окно документа получает фокус.
Функции доступа:
| bool | isActive() const |
| void | setActive(bool active = true) |
См. также QUndoGroup.
canRedo : const bool
Это свойство хранит информацию о возможности повторения действия.
Это свойство указывает, есть ли команда, которая может быть повторена.
Это свойство было добавлено в Qt 5.12.
Функции доступа:
| bool | canRedo() const |
Сигнал уведомления:
| void | canRedoChanged(bool canRedo) |
См. также canRedo(), index() и canUndo().
canUndo : const bool
Это свойство хранит информацию о возможности отмены действия.
Это свойство указывает, есть ли команда, которая может быть отменена.
Это свойство было добавлено в Qt 5.12.
Функции доступа:
| bool | canUndo() const |
Сигнал уведомления:
| void | canUndoChanged(bool canUndo) |
См. также canUndo(), index() и canRedo().
clean : const bool
Это свойство хранит состояние чистоты стека.
Это свойство указывает, чист ли стек. Например, стек чист, когда документ был сохранен.
Это свойство было добавлено в Qt 5.12.
Функции доступа:
| bool | isClean() const |
Сигнал уведомления:
| void | cleanChanged(bool clean) |
См. также isClean(), setClean(), resetClean() и cleanIndex().
redoText : const QString
Это свойство хранит текст для повторного выполнения следующей команды.
Это свойство хранит текст команды, которая будет выполнена повторно при следующем вызове redo().
Это свойство было добавлено в Qt 5.12.
Функции доступа:
| QString | redoText() const |
Сигнал уведомления:
| void | redoTextChanged(const QString &redoText) |
См. также redoText(), QUndoCommand::actionText() и undoText().
undoLimit : int
Это свойство хранит максимальное количество команд в стеке.
Когда количество команд в стеке превышает undoLimit, команды удаляются из нижней части стека. Макрос-команды (команды с дочерними командами) обрабатываются как одна команда. Значение по умолчанию равно 0, что означает, что нет ограничений.
Это свойство может быть установлено только при пустом стеке отмены, так как установка при непустом стеке может удалить команду в текущем индексе. Вызов setUndoLimit() для непустого стека выведет предупреждение и ничего не сделает.
Это свойство было добавлено в Qt 4.3.
Функции доступа:
| int | undoLimit() const |
| void | setUndoLimit(int limit) |
undoText : const QString
Это свойство хранит текст для отмены следующей команды.
Это свойство хранит текст команды, которая будет отменена при следующем вызове undo().
Это свойство было добавлено в Qt 5.12.
Функции доступа:
| QString | undoText() const |
Сигнал уведомления:
| void | undoTextChanged(const QString &undoText) |
См. также undoText(), QUndoCommand::actionText() и redoText().
Документация по членам-функциям
QUndoStack::QUndoStack(QObject *parent = nullptr)
Создает пустой стек отмены с родителем parent. Стек изначально находится в чистом состоянии. Если parent является объектом QUndoGroup, стек автоматически добавляется в группу.
См. также push().
void QUndoStack::canRedoChanged(bool canRedo)
Этот сигнал испускается всякий раз, когда значение canRedo() изменяется. Он используется для включения или выключения действия повторного выполнения, возвращаемого createRedoAction(). canRedo задаёт новое значение.
Примечание: Сигнал уведомления для свойства canRedo.
void QUndoStack::canUndoChanged(bool canUndo)
Этот сигнал испускается всякий раз, когда значение canUndo() изменяется. Он используется для включения или выключения действия отмены, возвращаемого createUndoAction(). canUndo задаёт новое значение.
Примечание: Сигнал уведомления для свойства canUndo.
[signal] void QUndoStack::cleanChanged(bool clean)
Этот сигнал излучается всякий раз, когда стек переходит в состояние чистоты или выходит из него. Если clean имеет значение true, стек находится в состоянии чистоты; в противном случае этот сигнал указывает на то, что он вышел из состояния чистоты.
Примечание: Сигнал уведомления для свойства clean.
См. также isClean() и setClean().
[signal] void QUndoStack::indexChanged(int idx)
Этот сигнал излучается всякий раз, когда команда изменяет состояние документа. Это происходит при отмене или повторении команды. При отмене или повторении макрокоманды, или при вызове setIndex(), этот сигнал излучается только один раз.
idx указывает индекс текущей команды, т. е. команды, которая будет выполнена при следующем вызове redo().
См. также index() и setIndex().
[slot] void QUndoStack::redo()
Повторяет текущую команду, вызвав QUndoCommand::redo(). Увеличивает индекс текущей команды.
Если стек пуст или если верхняя команда в стеке уже была повторена, эта функция ничего не делает.
Если для текущей команды QUndoCommand::isObsolete() возвращает true, то команда будет удалена из стека. Кроме того, если индекс чистоты больше или равен индексу текущей команды, то индекс чистоты сбрасывается.
[signal] void QUndoStack::redoTextChanged(const QString &redoText)
Этот сигнал излучается всякий раз, когда значение redoText() изменяется. Он используется для обновления свойства текста действия повтора, возвращаемого createRedoAction(). redoText указывает новый текст.
Примечание: Сигнал уведомления для свойства redoText.
[slot] void QUndoStack::resetClean()
Выходит из состояния чистоты и излучает cleanChanged(), если стек был чистым. Этот метод сбрасывает индекс чистоты до -1.
Обычно этот метод вызывается в следующих случаях, когда документ:
- был создан на основе шаблона и не был сохранён, поэтому с документом ещё не связан ни один файл.
- был восстановлен из резервной копии.
- был изменён вне редактора, и пользователь не перезагрузил его.
Эта функция была введена в Qt 5.8.
См. также isClean(), setClean() и cleanIndex().
[slot] void QUndoStack::setClean()
Помечает стек как чистый и излучает cleanChanged(), если стек ещё не был чистым.
Обычно это делается при сохранении документа.
Всякий раз, когда стек возвращается в это состояние с помощью команд отмены/повтора, он излучает сигнал cleanChanged(). Этот сигнал также излучается, когда стек выходит из состояния чистоты.
См. также isClean(), resetClean() и cleanIndex().
[slot] void QUndoStack::setIndex(int idx)
Повторяет вызовы undo() или redo(), пока индекс текущей команды не достигнет значения idx. Эту функцию можно использовать для перехода вперёд или назад по состоянию документа. indexChanged() излучается только один раз.
См. также index(), count(), undo() и redo().
[slot] void QUndoStack::undo()
Отменяет команду, расположенную ниже текущей команды, вызвав QUndoCommand::undo(). Уменьшает индекс текущей команды.
Если стек пуст или если нижняя команда в стеке уже была отменена, эта функция ничего не делает.
После отмены команды, если QUndoCommand::isObsolete() возвращает true, то команда будет удалена из стека. Кроме того, если индекс чистоты больше или равен индексу текущей команды, то индекс чистоты сбрасывается.
[signal] void QUndoStack::undoTextChanged(const QString &undoText)
Этот сигнал излучается всякий раз, когда значение undoText() изменяется. Он используется для обновления свойства текста действия отмены, возвращаемого createUndoAction(). undoText указывает новый текст.
Примечание: Сигнал уведомления для свойства undoText.
[virtual] QUndoStack::~QUndoStack()
Удаляет стек отмены, удаляя любые команды, которые в нём находятся. Если стек находится в QUndoGroup, то стек автоматически удаляется из группы.
См. также QUndoStack().
void QUndoStack::beginMacro(const QString &text)
Начинает составление макрокоманды с заданным описанием text.
В стек помещается пустая команда, описанная указанным text. Любые последующие команды, помещённые в стек, будут добавлены к дочерним элементам пустой команды до вызова endMacro().
Вызовы beginMacro() и endMacro() могут быть вложены, но каждый вызов beginMacro() должен иметь соответствующий вызов endMacro().
Пока составляется макрос, стек отключён. Это означает, что:
- indexChanged() и cleanChanged() не излучаются,
- canUndo() и canRedo() возвращают false,
- вызов undo() или redo() не оказывает никакого эффекта,
- действия отмены/повтора отключены.
Стек становится активным и излучаются соответствующие сигналы при вызове endMacro() для самого внешнего макроса.
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 Этот код эквивалентен:
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); См. также endMacro().
bool QUndoStack::canRedo() const
Возвращает true если есть команда, доступная для повтора; в противном случае возвращает false.
Эта функция возвращает false если стек пуст или если верхняя команда в стеке уже была повторена.
Эквивалентно index() == count().
Примечание: Функция-получатель для свойства canRedo.
См. также index() и canUndo().
bool QUndoStack::canUndo() const
Возвращает true если есть команда, доступная для отмены; в противном случае возвращает false.
Эта функция возвращает false если стек пуст или если нижняя команда в стеке уже была отменена.
Эквивалентно index() == 0.
Примечание: Функция-получатель для свойства canUndo.
См. также index() и canRedo().
int QUndoStack::cleanIndex() const
Возвращает индекс чистоты. Это индекс, при котором был вызван setClean().
У стека может не быть индекса чистоты. Это происходит, если документ сохранён, некоторые команды отменены, затем вставлена новая команда. Так как push() удаляет все отменённые команды перед вставкой новой команды, стек больше не может вернуться в состояние чистоты. В этом случае эта функция возвращает -1. -1 также может быть возвращено после явного вызова resetClean().
См. также isClean() и setClean().
void QUndoStack::clear()
Очищает стек команд, удаляя все команды из него и возвращая стек в чистое состояние.
Команды не отменяются и не повторяются; состояние редактируемого объекта не изменяется.
Эта функция обычно используется, когда содержимое документа отбрасывается.
См. также QUndoStack().
const QUndoCommand *QUndoStack::command(int index) const
Возвращает указатель на постоянную команду в позиции index.
Эта функция возвращает постоянный указатель, потому что изменение команды после её помещения в стек и выполнения почти всегда приводит к повреждению состояния документа, если команда впоследствии отменяется или повторяется.
Эта функция была введена в Qt 4.4.
См. также QUndoCommand::child().
int QUndoStack::count() const
Возвращает количество команд в стеке. Макрокоманды считаются как одна команда.
См. также index(), setIndex() и command().
QAction *QUndoStack::createRedoAction(QObject *parent, const QString &prefix = QString()) const
Создаёт объект QAction для действия отмены с заданным parent.
Вызов этого действия вызовет redo(). Текст этого действия — текст команды, которая будет выполнена при следующем вызове redo(), с добавлением указанного prefix. Если команда для отмены недоступна, это действие будет отключено.
Если prefix пустое, используется шаблон по умолчанию «Отменить %1» вместо префикса. До Qt 4.8 по умолчанию использовался префикс «Отменить».
См. также createUndoAction(), canRedo() и QUndoCommand::text().
QAction *QUndoStack::createUndoAction(QObject *parent, const QString &prefix = QString()) const
Создаёт объект QAction для действия возврата к предыдущему состоянию с заданным parent.
Вызов этого действия вызовет undo(). Текст этого действия — текст команды, которая будет отменена при следующем вызове undo(), с добавлением указанного prefix. Если команда для возврата недоступна, это действие будет отключено.
Если prefix пустое, используется шаблон по умолчанию «Вернуть %1» вместо префикса. До Qt 4.8 по умолчанию использовался префикс «Вернуть».
См. также createRedoAction(), canUndo() и QUndoCommand::text().
void QUndoStack::endMacro()
Завершает создание макрокоманды.
Если это самый внешний макрос в наборе вложенных макросов, эта функция выпустит indexChanged() один раз для всей макрокоманды.
См. также beginMacro().
int QUndoStack::index() const
Возвращает индекс текущей команды. Это команда, которая будет выполнена при следующем вызове redo(). Она не всегда является верхней командой в стеке, так как несколько команд могут быть отменены.
См. также setIndex(), undo(), redo() и count().
bool QUndoStack::isClean() const
Если стек находится в состоянии чистоты, возвращает true; в противном случае возвращает false.
Примечание: Функция-получатель для свойства clean.
См. также setClean() и cleanIndex().
void QUndoStack::push(QUndoCommand *cmd)
Добавляет cmd в стек или объединяет его с самой последней выполненной командой. В любом случае, выполняет cmd, вызывая его функцию redo().
Если cmd's id не -1, и если id совпадает с id последней выполненной команды, QUndoStack попытается объединить две команды, вызвав QUndoCommand::mergeWith() на последней выполненной команде. Если QUndoCommand::mergeWith() возвращает true, cmd удаляется.
После вызова QUndoCommand::redo() и, при необходимости, QUndoCommand::mergeWith(), будет вызвано QUndoCommand::isObsolete() для cmd или объединённой команды. Если QUndoCommand::isObsolete() возвращает true, то cmd или объединённая команда будут удалены из стека.
Во всех остальных случаях cmd просто добавляется в стек.
Если команды были отменены до добавления cmd, текущая команда и все команды выше неё удаляются. Следовательно, cmd всегда оказывается верхней в стеке.
После добавления команды стек берёт на себя ответственность за неё. Нет методов для возвращения команды, поскольку изменение её после выполнения почти всегда приводит к повреждению состояния документа.
См. также QUndoCommand::id() и QUndoCommand::mergeWith().
QString QUndoStack::redoText() const
Возвращает текст команды, которая будет выполнена при следующем вызове redo().
Примечание: Функция-получатель для свойства redoText.
См. также QUndoCommand::actionText() и undoText().
QString QUndoStack::text(int idx) const
Возвращает текст команды с индексом idx.
См. также beginMacro().
QString QUndoStack::undoText() const
Возвращает текст команды, которая будет отменена при следующем вызове undo().
Примечание: Функция-получатель для свойства undoText.
См. также QUndoCommand::actionText() и redoText().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qundostack.html