Qt中的QUndoCommand使用(实现撤销,前进)

首先想要再工程使用QUndoCommand类。必须要和QUndoStack类共同使用,才能实现多次撤销功能。
也就是说,继承QUndoCommand类,重写undo()redo(), 在这两个接口中实现自己需要撤销和前进的内容。
注意:UndoCommand一定要是局部变量push()到QUndoStack中,每一个UndoCommand对象是一步撤销。
class UndoCommand : public QUndoCommand
{
public:
    //撤销功能构造
    UndoCommand();

    //设置当前点击的item
    inline void setCurrentItem(const QLaneMarkGroup* item)
    {
        if(m_pCurrentMark == nullptr)
        {
            m_pCurrentMark = item;
        }
    }

    //设置当前场景对象
    inline void setCurrentScene(const QGraphicsScene* scene)
    {
        m_pScene = scene;
    }

    //设置标记点开始点击下的坐标
    void setOldPoint(QPointF oldPos);

protected:
    //撤销
    void undo()Q_DECL_OVERRIDE;

    //前进
    void redo()Q_DECL_OVERRIDE;

private:

    //当前场景对象
    QGraphicsScene* m_pScene;

    //当前标记点
    QLaneMarkGroup* m_pCurrentMark;

    //当前坐标
    QPointF m_pos;

};


UndoCommand::UndoCommand()
    : m_pCurrentMark(nullptr)
{

}

void UndoCommand::setOldPoint(QPointF oldPos)
{
    m_pos = oldPos;
}

void UndoCommand::undo()
{
    if(m_pCurrentMark != nullptr)
    {
        m_pCurrentMark->setPos(m_pos);
        m_pCurrentMark->setLaneMarkXY(RosQtCoordinate::mapSence2RosOdom(m_pos));
        m_pScene->update();
    }
}

void UndoCommand::redo()
{
    //do nothing
}


调用:
UndoCommand* undoCommand = new UndoCommand;
undoCommand->setCurrentItem(mark);
undoCommand->setOldPoint(mark->pos());
undoCommand->setCurrentScene(this);
if(m_pUndoStack != nullptr)
{
        m_pUndoStack->push(undoCommand);
}

在撤销按钮的槽函数中执行:
if(m_pUndoStack  != nullptr)
{
	m_pUndoStack ->undo();
}

在前进按钮的槽函数中执行:
if(m_pUndoStack  != nullptr)
{
	m_pUndoStack ->redo();
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pailugou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值