qt‘s Undo Framework

今天在项目中使用了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/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值