QUndoStack
QUndoStack类是QUndoCommand对象的堆栈。
撤销堆栈维护已应用于文档的命令堆栈。
使用push()将新命令推送到堆栈上。命令可以使用undo()和redo()来撤销和重做,或者触发createUndoAction()和createRedoAction()返回的操作。
QUndoStack跟踪当前命令。这是将在下一次调用redo()时执行的命令。该命令的索引由index()返回。可以使用setIndex()前滚或回滚已编辑对象的状态。如果堆栈上最上面的命令已经被重做,index()等于count()。
QUndoStack提供了对撤销和重做操作、命令压缩、命令宏的支持,并支持干净状态的概念。
QUndoCommand
QUndoCommand类是存储在QUndoStack上的所有命令的基类。
QUndoCommand表示一个文档上的单个编辑操作;例如,在文本编辑器中插入或删除文本块。QUndoCommand可以用redo()对文档应用更改,用undo()撤消更改。这些函数的实现必须在派生类中提供。
QUndoGroup
QUndoGroup类是一组QUndoStack对象。
有关Qt撤消框架的概述,请参阅概述。
一个应用程序通常有多个撤消堆栈,每个打开的文档对应一个撤消堆栈。同时,一个应用程序通常有一个撤消操作和一个重做操作,这将触发活动文档中的撤消或重做。
QUndoGroup是一组QUndoStack对象,其中一个可能是活动的。它有一个undo()和redo()槽,用于调用active stack的QUndoStack::undo()和QUndoStack::redo()。它还具有createUndoAction()和createRedoAction()函数。这些函数返回的操作与活动栈的QUndoStack::createUndoAction()和QUndoStack::createRedoAction()返回的操作相同。
用addStack()将堆栈添加到组中,用removeStack()将其删除。当以组作为其父QObject创建堆栈时,堆栈会隐式添加到组中。
程序员有责任通过调用QUndoStack::setActive()来指定哪个堆栈是活动的,通常是在相关的文档窗口接收到焦点时。活动堆栈也可以用setActiveStack()设置,并由activeStack()返回。
当使用addStack()将堆栈添加到组中时,组不接受堆栈的所有权。这意味着堆栈必须从组中单独删除。当一个堆栈被删除时,它会自动从一个组中删除。一个堆栈只能属于一个组。将它添加到另一个组将导致它从前一个组中被删除。
QUndoGroup与QUndoView相结合也很有用。如果一个QUndoView被设置为使用QUndoView::setGroup()来监视一个组,它将更新自己来显示活动堆栈。
参考qt官方例程:undoframework和undoframework example。