qt QUndoGroup的使用

最近项目中用到撤销,恢复功能。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

posted @ 2019-11-05 14:40  阳光下的小土豆  阅读(1418)  评论(0编辑  收藏  举报