c++实现qtableview撤销回退setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
时间: 2024-02-01 09:13:56 浏览: 170
QTableView添加复选框,下拉框控件
要实现QTableView的撤销/回退功能,需要记录下每次setData的修改前和修改后的数据,以便撤销时能够恢复原来的数据。
具体实现可以创建一个自定义的QStandardItemModel子类,重写setData方法,记录下修改前和修改后的数据,同时还要记录下操作的行列信息。在撤销时,将修改后的数据恢复为修改前的数据即可。
以下是一个简单的示例代码:
```c++
class MyTableModel : public QStandardItemModel
{
public:
explicit MyTableModel(int rows, int columns, QObject* parent = nullptr)
: QStandardItemModel(rows, columns, parent)
{
// 初始化撤销栈
m_undoStack = new QUndoStack(this);
}
// 重写setData方法
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override
{
// 记录修改前的数据
QStandardItem* item = itemFromIndex(index);
QVariant oldValue = item->data(role);
// 调用基类setData方法进行修改
bool result = QStandardItemModel::setData(index, value, role);
if (result)
{
// 记录修改后的数据和操作信息
QVariant newValue = item->data(role);
QPair<QModelIndex, QVariant> edit(index, newValue);
m_edits.push(edit);
m_currentEdit = edit;
emit dataChanged(index, index);
// 将操作添加到撤销栈中
m_undoStack->push(new EditCommand(this, oldValue, newValue, index, role));
}
return result;
}
// 撤销操作
void undo()
{
if (m_undoStack->canUndo())
{
m_undoStack->undo();
if (!m_edits.isEmpty())
{
m_currentEdit = m_edits.pop();
emit dataChanged(m_currentEdit.first, m_currentEdit.first);
}
}
}
// 回退操作
void redo()
{
if (m_undoStack->canRedo())
{
m_undoStack->redo();
if (!m_edits.isEmpty())
{
m_currentEdit = m_edits.pop();
emit dataChanged(m_currentEdit.first, m_currentEdit.first);
}
}
}
private:
// 记录修改前和修改后的数据
QStack<QPair<QModelIndex, QVariant>> m_edits;
QPair<QModelIndex, QVariant> m_currentEdit;
// 撤销栈
QUndoStack* m_undoStack;
// 定义撤销命令
class EditCommand : public QUndoCommand
{
public:
EditCommand(MyTableModel* model, QVariant oldValue, QVariant newValue, QModelIndex index, int role)
: m_model(model)
, m_oldValue(oldValue)
, m_newValue(newValue)
, m_index(index)
, m_role(role)
{}
void undo()
{
m_model->setData(m_index, m_oldValue, m_role);
}
void redo()
{
m_model->setData(m_index, m_newValue, m_role);
}
private:
MyTableModel* m_model;
QVariant m_oldValue;
QVariant m_newValue;
QModelIndex m_index;
int m_role;
};
};
```
在使用时,可以将QTableView的model设置为MyTableModel的实例,并在需要撤销/回退时调用undo和redo方法即可。
阅读全文