Qt新增撤銷-前進動作(轉)
阿新 • • 發佈:2022-05-30
一、前言
很多軟體中,都有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是前進;