Обзор механизма отмены Qt
Введение
Механизм отмены Qt — это реализация паттерна Команда, предназначенная для реализации функций отмены/повторного выполнения действий в приложениях.
Паттерн Команда основан на идее, что все правки в приложении выполняются путём создания экземпляров объектов команды. Объекты команды применяют изменения к документу и хранятся в стеке команд. Кроме того, каждая команда знает, как отменить свои изменения, чтобы вернуть документ в предыдущее состояние. Пока приложение использует только объекты команды для изменения состояния документа, можно отменить последовательность команд, перебирая стек вниз и вызывая отмену для каждой команды. Также можно повторить последовательность команд, перебирая стек вверх и вызывая повторное выполнение для каждой команды.
Классы
Фреймворк состоит из четырёх классов:
- QUndoCommand — базовый класс для всех команд, хранящихся в стеке отмены. Он может применить (повторить) или отменить одно изменение в документе.
- QUndoStack — список объектов QUndoCommand. Он содержит все команды, выполненные над документом, и может прокрутить состояние документа назад или вперёд, отменяя или повторяя их.
- QUndoGroup — группа стеков отмены. Она полезна, когда приложение содержит более одного стека отмены, обычно один на каждый открытый документ. QUndoGroup предоставляет единую пару слотов отмены/повторного выполнения для всех стеков в группе. Она перенаправляет запросы на отмену и повторное выполнение в активный стек, который связан с документом, который в данный момент редактирует пользователь.
- QUndoView — виджет, который отображает содержимое стека отмены. Нажатие на команду в представлении прокручивает состояние документа назад или вперёд к этой команде.
Концепции
Фреймворк поддерживает следующие концепции:
- Состояние чистоты (Clean state): Используется для сигнализации о входе и выходе документа в состояние, сохранённое на диске. Обычно используется для отключения или включения действий сохранения и для обновления строчки заголовка документа.
- Сжатие команд (Command compression): Используется для сжатия последовательности команд в одну команду. Например: В текстовом редакторе команды, вставляющие отдельные символы в документ, можно сжать в одну команду, вставляющую целые фрагменты текста. Эти более крупные изменения удобнее отменить и повторить пользователю.
- Макросы команд (Command macros): Последовательность команд, все из которых отменяются или повторяются за один шаг. Это упрощает задачу написания приложения, поскольку набор более простых команд можно объединить в более сложные команды. Например, команда, перемещающая набор выделенных объектов в документе, может быть создана путём объединения набора команд, каждая из которых перемещает один объект.
QUndoStack предоставляет удобные объекты QAction для отмены и повторения, которые можно вставить в меню или панель инструментов. Свойства текста этих действий всегда отражают, какая команда будет отменена или повторена при их запуске. Аналогично, QUndoGroup предоставляет действия отмены и повторения, которые всегда ведут себя как действия отмены и повторения активного стека.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qundo.html