讲方法和发代码都行,最近在搞这个,自己没搞成功,所以特来请教大家
是指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"
有问题及时留言.
温馨提示:答案为网友推荐,仅供参考