QUndoCommand与Qt的撤销操作

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 
#include 

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;
    }
}

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

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

你可能感兴趣的:(Qt)