首先想要再工程使用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();
}
Qt中的QUndoCommand使用(实现撤销,前进)
于 2020-12-16 17:44:18 首次发布