qt的redo和undo undo撤销(后退),redo取消撤销(前进)

时间:2023-01-25 16:51:31

Qt下使用类QUndoStack、QCommands、QUndoGroup等类实现保存用户操作。

保存用户的原理比较容易理解。之前我们所写的用户操作,如鼠标点击后的响应,都是直接写在mouseEvent下的,不能实现保存。

现在使用QCommands类将用户操作进行封装,将需要的参数保存起来在将这些commands放到undoStack中,由undoStack管理这些用户操作的加入、清除、执行下一个等功能。

    下面讲讲具体实现步骤:

    以用户操作一个dialog消失,与出现的功能为例.

    1、在主窗口中添加一个QUndoStack成员变量,并在初始化的时候初始化。

      mainwindow.h下:

      QUndoStack *m_UndoStack;

      mainwindow::mainwindow()下:

      m_UndoStack = new QUndoStack(this);

    2、剪切掉原来你所写的响应,把响应换成

      m_UndoStack->push(new myCommands(dialog,oldT,newT));

      //这里oldT,newT分别表示之前窗口的状态,和现在你需要的状态。    

    3、继承一个QCommands类,重载它的构造函数、undo()、redo()这三个函数。

      构造函数的参数要有实现用户操作后响应,需要的所有参数。

      myCommands::myCommands(QDialog *dialg,bool oldT,bool newT)

       {

              m_Dialog = dialog;            //将这些数据放在成员变量里

              m_oldT = oldT;

             m_newT = newT;

       } 

       重载redo()函数实现前进功能

       myCommands::redo()

       {

            if(m_newT==0)

                  m_Dialog->show();

            else

                  m_Dialog->hide();

       }

       重载undo()实现撤销功能    

        myCommands::redo()

       {

            if(m_oldT==0)

                  m_Dialog->show();

            else

                  m_Dialog->hide();

       }

其实撤销就是在执行undo()函数,前进就是在执行redo()函数。而用户第一次操作的时候其实就已经执行了一遍redo()函数,之后想撤销或者前进在重新调用这俩函数。

     说了这么久,用户怎么样才能撤销还没说呢。QUndoStack提供了 createUndoAction和createRedoActiong直接做了Action让我们用,很方便。只要在mainwindow里加上:

    QAction *undoAction = m_UndoStack->createUndoAction(this);

QAction *redoAction =m_UndoStack->createRedoAction(this);

undoAction->setIcon(QIcon("undo.png"));//选两张撤销 前进的icon图片

redoAction->setIcon(QIcon("redo.png"));

undoAction->setToolTip("返回");

redoAction->setToolTip("前进");

ui->mainToolBar->insertAction(ui->mainToolBar->actions().value(ui->mainToolBar->actions().size()),undoAction);

ui->mainToolBar->insertAction(undoAction,redoAction);

下面来实现下快捷键:

undoAction->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_Z));

redoAction->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_Y));

这样功能就几本上实现了。

具体使用细节还需要参照文档慢慢摸索,这里只介绍一个路线。想要具体的例子可以打开你的Qt安装的根目录,打开里面的Demo/undo。这就是做好的例子,最好的学习资料。

欢迎关注新浪微博:学Qt编程