1. 程式人生 > 其它 >Qt新增撤銷-前進動作(轉)

Qt新增撤銷-前進動作(轉)

一、前言

很多軟體中,都有Ctrl-Z撤回的操作,例如visio、Word等一些編輯器。在使用軟體的時候,難免會有手誤操作,例如,我碼了一堆的字,想全選-複製,結果全選-刪除了,還沒有儲存,如果沒有撤回功能的話,字就白碼了,還得重複一遍,所以軟體有回撤功能是挺方便的。

二、Qt中的回撤棧

三、使用流程

1、建立QUndoStack和QUndoView

m_undoStack = new QUndoStack(this); //存放命令的棧

//新增QAction,Ctrl-Z作為回撤的快捷鍵
m_undoAction = m_undoStack->createUndoAction(this,"Undo");
m_undoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z));

//新增QAction,Ctrl-Y左右前進的快捷鍵
m_redoAction = m_undoStack->createRedoAction(this,"Redo");
m_redoAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Y));

//MainWindow中新增QAction
addAction(m_undoAction);
addAction(m_redoAction);

//建立回撤棧視窗
m_undoView = new QUndoView(m_undoStack);
m_undoView->show();

2、實現自己的命令

  • 繼承QUndoCommand;
  • 實現介面redo()、undo();
  • redo是前進,undo是撤回;
  • 例項化命令,會自動呼叫redo();

新增器件命令:

//新增電力器件
class addLineItemCommand : public QUndoCommand
{
public:
    addLineItemCommand();

    void redo() override;
    void undo() override;
};

//---------------------------------------------------------------------------------------------------

//新增電力器件
addLineItemCommand::addLineItemCommand()
{
    setText("add LineItem");
}

void addLineItemCommand::redo()
{
	//新增
}
void addLineItemCommand::undo()
{
	//取消新增
}

刪除器件命令:

//刪除電力器件
class delLineItemCommand : public QUndoCommand
{
public:
    delLineItemCommand();

    void redo() override;
    void undo() override;
};

//-----------------------------------------------------------------------------------------------

//刪除電力器件
delLineItemCommand::delLineItemCommand()
{
    setText("del lineItem");
}

void delLineItemCommand::redo()
{
    //刪除
}
void delLineItemCommand::undo()
{
    //取消刪除
}

3、建立命令併入棧

QUndoCommand* addLineItem = new addLineItemCommand();
mainWin->m_undoStack->push(addLineItem);

入棧之後,回撤棧視窗(QUndoView)中會顯示入棧後的命令:

視窗中顯示的命令文字,通過命令建構函式中的setText("add LineItem")來設定;

4、切換棧索引

可以直接點選QUndoView來切換;也可以使用我們設定的快捷鍵來切換,Ctrl-Z是撤銷,Ctrl-Y是前進;