采用Qt's Undo Framework实现undo和redo操作。
比如在做一个记事本程序 想要实现一个删除文本的操作,这个操作可以撤销和重现,即可以实现所谓的undo()和redo()操作。
此时只需让删除操作继承至QUndoCommand类,比如叫做DeleteTextCommand,并实现redo和undo这两个虚函数。在删除操作的响应槽函数SlotDeleteText()中,创建DeleteTextCommand对象,并放入QUndoStack。
如下代码所示:
删除类.h文件
class DeleteTextCommand:public QUndoCommand
{
public:
// 构造函数
DeleteTextCommand();
// 实现redo 、undo
void
undo();
void
redo();
}
在undo和redo函数中实现具体的操作,在redo中实现删除操作,undo中实现撤销删除操作,恢复删除之前的状态,思路是在redo中保存一份被删除的东西的列表,在undo中获取,就是使用这份列表进行复原。
删除槽函数:
void CMainWin::slotDeleteText()
{
QUndoCommand *pDeleteTextCommond = new DeleteTextCmd();
m_pUndoStack->push(pDeleteTextCommond);
//push的时候会自动去调用DeleteTextCmd的redo方法。
}
需要注意的是:在QUndoStack把命令push到堆栈的时候,会自动调用一次此命令的redo方法。
在主函数中 实现撤销和复原功能如下,如下写:
void WorkflowSceneManager::slotUndo()
{
m_pUndoStack->undo();//自动调用DeleteTextCommand的undo方法
HideAllModuleNameEdit();
}
void WorkflowSceneManager::slotRedo()
{
m_pUndoStack->redo();//自动调用DeleteTextCommand的redo方法
HideAllModuleNameEdit();
}
具体原理为command设计模式,待补充。