qt 画图撤销功能

————————————————
版权声明:文章摘自百度知道的回答,版权归原作者所有,转载请附上原文出处链接及本声明。。
原文链接:https://zhidao.baidu.com/question/1638894180919572660.html

 

看到一个百度知道的一个回答可能可以实现画图撤销功能,还没有测试,但方法应该是对的,为方便以后查找,因此摘抄写下来,没有验证,也有可能实现不了。

是指Redo和Undo吗?

如果是, 那么请注意两个核心类QUndoCommand 和 QUndoStack

 

  • QUndoStack

    可以看作是是控制器

    它的作用是提供动作的存储(Do), 控制动作恢复(Redo), 撤销(Undo), 甚至复杂的动作合并(将同样的Command合成为一个), 动作宏(通过描述符来描述一些列动作), 等等

        

  • 而QUndoCommand

    可以看作是一种动作, 它保存了你动作的状态, 同时也提供在恢复和撤销时的行为

    (例如, 当用户拖动从开始到结束, 可以把整个行为看成"拖动"动作, 它存储了拖动的坐标)

    当然, 动作的粒度可以你自己来定义, 也可以把上述例子分成多个动作(拖动开始, 拖动以及拖动结束)

     

那么, 模型就很简单了, 你看, 你只需要实现对应的QUndoCommand即可

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

class DrawTriangleCommand : public QUndoCommand

{

private:

    SceneController *_controller;   //! 你的绘图控制器

    TriangleObject *_object;        //! 三角e799bee5baa6e79fa5e98193e78988e69d8331333335346136形对象

     

public:

    virtual void undo() override

    {

        _controller->remove(_object);

        _controller->askForUpdate();

    }    

     

    virtual void redo() override

    {

        _controller->add(_object);

        _controller->askForUpdate();

    }

};

 

class CanvasView : public QUndoView

{

private:

    QUndoStack *_undoStack;

    SceneController *_controller;

 

public:

    virtual bool event(QEvent *e)

    {

        if (e->type() == OnAddedTriangle)    //! 在已经添加三角形对象后触发自定义事件

        {

            TriangleObject *triangle = /* cast from e */ //! 获取对象

            _undoStack->push(new DrawTriangleCommand(_controller, triangle));     

        }

    }

}

上述的代码仅仅提供流程说明, 直接手打的, 不涉及任何项目和API, 具体还是应该看QT的文档, 这块也有比较详细的说明, 请搜索关键字"Qt Undo Framework"

————————————————
版权声明:文章摘自百度知道的回答,版权归原作者所有,转载请附上原文出处链接及本声明。。
原文链接:https://zhidao.baidu.com/question/1638894180919572660.html

你可能感兴趣的:(qt 画图撤销功能)