请教qt中用c++编绘图板的恢复与撤销功能该如何实现?

讲方法和发代码都行,最近在搞这个,自己没搞成功,所以特来请教大家... 讲方法和发代码都行,最近在搞这个,自己没搞成功,所以特来请教大家 展开
 我来答
百度网友dccd79ab8
推荐于2016-08-02 · TA获得超过739个赞
知道小有建树答主
回答量:292
采纳率:100%
帮助的人:185万
展开全部

是指Redo和Undo吗?

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


  • QUndoStack

    可以看作是是控制器

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

        

  • 而QUndoCommand

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

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

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


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

class DrawTriangleCommand : public QUndoCommand
{
private:
    SceneController *_controller;   //! 你的绘图控制器
    TriangleObject *_object;        //! 三角形对象
    
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"


有问题及时留言.

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式