最近项目中用到撤销,恢复功能。qt的demo中有一个例子,是类似于单文档的。而我的项目中是类似于多文档的项目,即可能要打开多个页面,不同的页面都有撤销恢复功能。这样的话,就要用到QUndoGroup类。网上资料相对较少。我把自己的探索写出来,抛砖引玉,和大家讨论。

我把我的工程结构大概描述一下:MainFrame为主框架,MainFrame有菜单栏,且在MainFrame中有多个tab页(多个窗口)。

这样,我下文中将tab页的两个窗口类名记为A,B。

我在MainFrame类中定义成员变量 QUndoGroup* undoGroup;   QMenu* editMenu;  (当然还有其他menu,这里略)

在A,B中分别定义 QUndoStack* undoStack;

在初始化的时候,创建菜单

editMenu = menuBar()->addMenu("编辑");

undoGroup = new QUndoGroup(this);

undoAction = undoGroup->createUndoAction(this, "撤销");
undoAction->setShortcuts(QKeySequence::Undo); redoAction = undoGroup->createRedoAction(this, "恢复"); redoAction->setShortcuts(QKeySequence::Redo); editMenu->addAction(undoAction); editMenu->addAction(redoAction);

 以上代码在mainwindow构造函数中。

在不同的tab页的窗口(A、B)类中,定义QUndoStack* undoStack;并初始化。

初始化时,undoStack = new QUndoStack(MainWindow*);这里要用MainWindow的指针。

为了方便,可以定义全局MainWindow* pMain,在MainWindow的构造函数中,pMain = this;在A和B类中定义函数initUndoStack

void initUndoStack()

{

  undoStack = new QUndoStack(pMain);

  pMain->undoGroup.addStack(undoStack);

}

切换tab页时,要激活对应tab页的undoStack:即undoStack->setActive(true);

如我在A、B类中分别定义函数

void setUndoStackActive(bool bActive)

{

  undoStack->setActive(bActive);

}

切换窗口时,调用对应的类的setUndoStackActive函数即可。

对于QUndoCommand类的使用,可参考Qt 的示例Undo FrameWork Example

05-27 07:36