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);//创建了一个addCommand
undoStack->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中封装场景中的itemscene->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.
————————————————
版权声明:本文为CSDN博主「证券指标」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangbinsijifeng/article/details/46441681
Qt學習應用之路——Undo/Redo (例子)
http://hk.noobyard.com/article/p-nnoahpff-mr.html