qt‘s Undo Framework

来源:互联网 发布:软件培训计划 编辑:程序博客网 时间:2024/06/04 18:17

今天在项目中使用了Qt's Undo Framework实现了undo 和redo功能,初步尝试,此框架还挺好用。下面把使用心得与大家分享。

采用Qt's Undo Framework实现undo和redo操作。每类操作继承至QUndoCommand类,并实现redo和undo这两个虚函数,再在动作执行的时候创建此子类的对象,并放入QUndoStack。用QUndoStack创建redo和undo这个两个QAction,这两个QAction不需要对其进行设置信号和槽,在QUndoStack中创建Action的时候就已经完成。
需要注意的是:在QUndoStack把命令push到堆栈的时候,会自动调用一次此命令的redo方法,所以如果不加小心点时候,会发现执行了两次redo方法。可以在执行命令的时候,直接创建命令,再push到堆栈,在push之前不要执行命令。
实例如下:
一:首先声明命令对象如下:
class delCmd :public QUndoCommand
{
public:
 
// 构造函数
delCmd(GraphicsScene *gScene, QGraphicsItem* item,QUndoCommand *parent = 0);
 
// 实现redo 、undo
void undo();
void redo();
 
private:
GraphicsScene* m_scene;
QGraphicsItem* m_item;
};
二:在执行删除操作时创建命令
void GraphicsScene::iDelete()
{
foreach (QGraphicsItem *item, selectedItems()) 
{
if(item)
{
removeItem(item);
 
// 放入命令堆栈
delCmd* dcmd = new delCmd(this,item);
m_undoStack->push(dcmd);
}
}
}
三:创建redo/undo Action
QAction* GraphicsScene::createRedoAction()
{
QAction* redo = m_undoStack->createRedoAction(this,tr("重做"));
redo->setIcon(QIcon("images/stock_redo.png"));
return redo;
}
 
QAction* GraphicsScene::createUndoAction()
{
QAction* undo = m_undoStack->createUndoAction(this,tr("撤销"));
undo->setIcon(QIcon("images/stock_undo.png"));
undo->setShortcut(tr("ctrl+z"));
return undo;
}
四:把redo /undo Action加入到工具栏
        QAction* undo = m_scene->createUndoAction();
QAction* redo = m_scene->createRedoAction();
ui->mainToolBar->addAction(undo);
ui->mainToolBar->addAction(redo);


五:结束语
本人从接触到使用只用了一天时间,所以写的不好,请谅解。
本文来源:http://yleesun.blog.163.com/blog/static/2941340220106245014562/
原创粉丝点击