qt中的undo和redo机制。

来源:互联网 发布:淘宝摄影需要什么器材 编辑:程序博客网 时间:2024/06/05 04:36

1.

首先知道undo和redo动作的创建。

这两个动作是由QUndoStack创建的。

当点击undo或者redo的时候,qt框架就自动调用QUndoStack中处于栈顶位置的QUndoCommand命令。


QAction *unDO =  m_undoStack->CreateAction( this,tr("undo") );

QAction *reDO = m_undoStack->CreateAction(  this,tr("redo")  );


2.

主窗口中增加一个item。比如addBox

QUndoCommand *addCommand = new AddCommand(DiagramItem::Box, diagramScene);//创建了一个addCommandundoStack->push(addCommand);//调用QUndoStack的redo()方法 将一个addCommand添加到undoStack中,这样才调用了addcommand的redo()方法。
首先创建相应的QUndoCommand命令,然后将该QUndoCommand命令添加到undoStack中,这个push()方法会导致,该QUndoCommand命令的redo()方法被调用。


3.

AddCommand::AddCommand(DiagramItem::DiagramType addType,                       QGraphicsScene *scene, QUndoCommand *parent)    : QUndoCommand(parent){    static int itemCount = 0;    myGraphicsScene = scene;//在command中封装场景    myDiagramItem = new DiagramItem(addType);//在Command中封装场景中的item
    scene->update();    ++itemCount;}
在QUndoCommand中封装场景QGraphicsSence和QGraphicsItem项,但是构造函数中没有做将item添加到场景中的操作。


4.

//add box操作中调用了undoStack的push()方法,该方法导致AddCommand的redo()方法调用
void AddCommand::redo()
{
    myGraphicsScene->addItem(myDiagramItem);
    myDiagramItem->setPos(initialPosition);
    myGraphicsScene->clearSelection();
    myGraphicsScene->update();
}

在QUndoCommand的redo()方法中,才将item添加到场景中。



5.

会需要三个QUndoCommand:AddCommand,MoveCommand,DeleteCommand。

因为item会被添加进场景中,在场景中移动,从场景中删除。



具体,看例子,QT中的Demo/undo frame.


0 0
原创粉丝点击