QUndoCommand 的撤销操作其实demo里面已经有了,最近模仿excel做了很多操作,这里总结一下。

QUndoStack是一个栈专门用来装QUndoCommand

QUndoCommand重写他的undo()和redo()就可以进行撤销操作了

同时QUndoStack还给了前进和后退的两个action

    QAction *undoAction = m_UndoStack->createUndoAction(this);
    QAction *redoAction = m_UndoStack->createRedoAction(this);
    undoAction->setIcon(QIcon("://image/back.png")); //选两张撤销 前进的icon图片
    redoAction->setIcon(QIcon("://image/forward.png"));
    ui->mainToolBar->addAction(undoAction);
    ui->mainToolBar->addAction(redoAction);
每个命令最好单独写成一个类
比如,要加一个QTableWidgetItem 文字被编辑以后撤销的功能

editcommand.h

#include <QUndoCommand>
#include <QTableWidgetItem>
class EditCommand : public QUndoCommand
public:
    explicit EditCommand(QTableWidgetItem* item=0,QString ori_text="",QString new_text="",QUndoCommand *parent = 0);
    void undo();
    void redo();
signals:
public slots:
private:
    QString m_oritext;
    QString m_newtext;
    QTableWidgetItem* m_tableitem;

editcommand.cpp
EditCommand::EditCommand(QTableWidgetItem* item,QString ori_text,QString new_text,QUndoCommand *parent) :
    QUndoCommand(parent)
    this->setText("Edit text");
    m_tableitem=item;
    m_oritext=ori_text;
    m_newtext=new_text;
void EditCommand::undo()
    m_tableitem->setText(m_oritext);
void EditCommand::redo()
    m_tableitem->setText(m_newtext);
这个ori_text 和 new_text则是通过信号 ItemChanged()得到的,其中的ori_text 是在keyevent 时 key==Qt::key_return 时记录
void XlsxTableWidget::SlotItemEdit(QTableWidgetItem *new_item)
    if(new_item->text()!=ori_text)
        EditCommand* text_command=new EditCommand(new_item,ori_text,new_item->text(),NULL);
        m_stack->push(text_command);
        is_edit=false;

这样可以完成一个撤销,前进的功能了

比如合并单元格,字体,边框绘制,也能用类似的方式完成

QUndoCommand 的撤销操作其实demo里面已经有了,最近模仿excel做了很多操作,这里总结一下。QUndoStack是一个栈专门用来装QUndoCommandQUndoCommand重写他的undo()和redo()就可以进行撤销操作了同时QUndoStack还给了前进和后退的两个action QAction *undoAction = m_UndoStack->c 1.QUndoStack: 一个存放 QUndoCommand 命令的栈. 2.QUndoCommand:The QUndoCommand class is the base class of all commands stored on a QUndoStack. 3.QUndoView:The QUndoView class displays the contents of ... 1、QUndoStack类是QUndoCommand对象的堆栈。 2、QUndoStack跟踪当前命令。 这是下一次对redo()的调用将执行的命令。该命令的索引由index()返回。 1.1、撤销和回撤动作 QUndoStack提供了方便的撤消和回撤QAction对象,可以将其插入菜单或工具栏。撤消或回撤命令时,QUndoStack将更新这些操作的文本属性以反映它们将触发的更改。当没有命令可用于撤消或重做时,这些操作也将被禁用。这些动作由createUndoAction()和create 1、QUndoCommand表示对文档的单个编辑操作。例如,在文本编辑器中插入或删除文本块。QUndoCommand可以使用redo()将更改应用于文档,并使用undo()撤消更改。这些功能的实现必须在派生类中提供。如: 2、QUndoCommand对象由它们被压入的堆栈所拥有。如果命令已被撤消并且推送了新命令,则QUndoStack会删除该命令。例如: MyCommand *command1 = new MyCommand(); stack->push(command1);
可以使用 Qt 的 QUndoStack 类来实现撤销/回退的历史记录操作。QUndoStack 类维护一个操作的堆栈,您可以使用 push() 将新操作压入堆栈,并使用 undo() 和 redo() 方法在堆栈中导航。 要使用 QUndoStack,需要创建一个 QUndoCommand 子类并实现它的 redo() 和 undo() 方法。每当需要执行一个操作时,您都应该创建一个新的 QUndoCommand 对象并将其传递给 QUndoStack 的 push() 方法。QUndoStack 会自动调用 QUndoCommand 的 redo() 方法来执行操作,并将该命令压入堆栈。 QUndoStack *undoStack = new QUndoStack(this); // ... // 当需要执行一个操作undoStack->push(new MyUndoCommand(/* 参数 */)); 当用户选择撤销操作时,可以调用 QUndoStack 的 undo() 方法来撤销最近一次操作: // 在响应撤销操作的按钮单击事件中 if (undoStack->canUndo()) undoStack->undo(); 同样,当用户选择重做操作时,可以调用 QUndoStack 的 redo() 方法来重做最近一次撤销操作: // 在响应重做操作的按钮单击事件中 if (undoStack->canRedo()) undoStack->redo(); 希望这对您有帮助。