• 9220阅读
  • 3回复

Qt's Undo Framework 使用总结 [复制链接]

上一主题 下一主题
离线yleesun
 

只看楼主 正序阅读 楼主  发表于: 2010-07-02
今天在项目中使用了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);


五:结束语
    本人从接触到使用只用了一天时间,所以写的不好,请谅解。
离线yj0603
只看该作者 3楼 发表于: 2013-01-23
楼主你好,感谢你的分享。这里有个问题想请教下楼主
嗯,最近我也在用qt的undostack,但是有一个比较奇怪的地方,前面的操作我和楼主的基本一致;也是先定义了一个公开继承至QUndoCommand的类,
然后每次压栈操作时将这个类压入QUndoStack,我跟踪了每次压栈后栈数据的变化(通过count函数),发现确实数值变化了,但是不知但为什么我写的
redo,undo操作的图标始终是disabled状态,我redo,undo2个操作跟楼主的实现方式一致。
请楼主不吝赐教,万分感谢~
离线geng_jw
只看该作者 2楼 发表于: 2010-07-05
学习了,小顶一下,呵呵
离线axlrose

只看该作者 1楼 发表于: 2010-07-03
还没留意到Qt有undo framework
感谢楼主经验的分享
枪炮与玫瑰
快速回复
限100 字节
 
上一个 下一个