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

讲方法和发代码都行,最近在搞这个,自己没搞成功,所以特来请教大家

是指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"


有问题及时留言.

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网