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