Overview of Qt's Undo Framework
Introduction
Qt 的撤消框架是命令模式的实现, 可以在应用程序中实现撤消/重做功能.
命令模式基于这样的思想: 应用程序中的所有编辑都是通过创建命令对象的实例来完成的. 命令对象将更改应用于文档并存储在命令堆栈中. 此外, 每个命令都知道如何撤消其更改以使文档恢复到之前的状态. 只要应用程序仅使用命令对象来更改文档的状态, 就可以通过向下遍历堆栈并依次对每个命令调用撤消来撤消一系列命令. 还可以通过向上遍历堆栈并对每个命令调用重做来重做一系列命令.
类
这个框架由 4 个类组成:
- QUndoCommand 是所有命令的基类, 存储在撤销堆栈上. 它可以应用 (重复) 或撤销文档中的单个更改.
- QUndoStack 是 QUndoCommand 对象列表. 它包含在文档上执行的所有命令, 并且可以通过撤消或重复来向后或向前滚动文档的状态.
- QUndoGroup 是一组撤消堆栈. 当应用程序包含多个撤消堆栈 (通常每个打开的文档一个) 时, 它非常有用. QUndoGroup 为组中的所有堆栈提供一对撤消/重复槽. 它将撤消和重复请求转发到活动堆栈, 该堆栈是与用户当前正在编辑的文档关联的堆栈.
- QUndoView 是一个显示撤消堆栈内容的小部件. 单击视图中的命令可将文档的状态向后或向前滚动到该命令.
Concepts
这个框架支持以下概念:
- 干净状态: 在文档进入和离开已保存到磁盘的状态时发出信号. 这通常用于禁用或启用保存操作, 以及更新文档的标题栏.
- 命令压缩: 将命令序列压缩为单个命令. 例如: 在文本编辑器中, 将单个字符插入文档的命令可以压缩为插入整个文本部分的单个命令. 这些较大的更改更方便用户撤消和重复.
- 命令宏: 一系列命令, 所有命令都在一个步骤中撤消或重复. 这些简化了编写应用程序的任务, 因为一组更简单的命令可以组合成更复杂的命令. 例如, 移动文档中一组选定对象的命令可以通过组合一组命令来创建, 每个命令移动一个对象.
QUndoStack 提供方便的撤消和重复 QAction 对象, 可以将其插入菜单或工具栏. 这些操作的文本属性始终反映触发时将撤消或重做哪些命令. 类似地, QUndoGroup 提供的撤消和重复操作始终与活动堆栈的撤消和重复操作类似.