c++ 通过qvector实现支持qtableview操作支持撤销回退
时间: 2023-08-18 13:06:09 浏览: 193
C++vector的实现
5星 · 资源好评率100%
要实现支持撤销回退的QTableView操作,可以使用以下步骤:
1. 创建一个QVector,用于存储QTableView操作的历史记录。
2. 在每次进行QTableView操作时,将操作信息(比如插入、删除、修改等操作)添加到QVector中。
3. 在进行undo操作时,从QVector中取出最后一次操作,并执行其相应的undo操作,将QTableView恢复到上一次操作的状态。
4. 在进行redo操作时,从QVector中取出最后一次undo操作,并执行其相应的redo操作,将QTableView恢复到下一次操作的状态。
下面是一个简单的示例代码:
``` c++
#include <QVector>
#include <QStandardItemModel>
#include <QTableView>
class TableHistory {
public:
enum ActionType {
Insert,
Remove,
Edit
};
struct Action {
ActionType type;
int row;
int column;
QVariant oldValue;
QVariant newValue;
};
void addAction(Action action) {
m_history.push_back(action);
}
bool canUndo() const {
return !m_history.isEmpty();
}
bool canRedo() const {
return !m_redoHistory.isEmpty();
}
void undo(QStandardItemModel* model) {
if (canUndo()) {
Action action = m_history.takeLast();
switch (action.type) {
case Insert:
model->removeRow(action.row);
break;
case Remove:
model->insertRow(action.row);
for (int column = 0; column < model->columnCount(); ++column) {
auto item = model->item(action.row, column);
item->setData(action.oldValue, Qt::EditRole);
}
break;
case Edit:
model->setData(model->index(action.row, action.column), action.oldValue, Qt::EditRole);
break;
}
m_redoHistory.push_back(action);
}
}
void redo(QStandardItemModel* model) {
if (canRedo()) {
Action action = m_redoHistory.takeLast();
switch (action.type) {
case Insert:
model->insertRow(action.row);
for (int column = 0; column < model->columnCount(); ++column) {
auto item = model->item(action.row, column);
item->setData(action.newValue, Qt::EditRole);
}
break;
case Remove:
model->removeRow(action.row);
break;
case Edit:
model->setData(model->index(action.row, action.column), action.newValue, Qt::EditRole);
break;
}
m_history.push_back(action);
}
}
private:
QVector<Action> m_history;
QVector<Action> m_redoHistory;
};
class TableView : public QTableView {
public:
TableView(QWidget* parent = nullptr) : QTableView(parent) {
connect(model(), &QStandardItemModel::itemChanged, this, &TableView::onItemChanged);
}
void undo() {
m_history.undo(model());
}
void redo() {
m_history.redo(model());
}
private:
void onItemChanged(QStandardItem* item) {
TableHistory::Action action;
action.type = TableHistory::Edit;
action.row = item->row();
action.column = item->column();
action.oldValue = item->data(Qt::EditRole);
action.newValue = item->data(Qt::EditRole);
m_history.addAction(action);
}
void rowsInserted(const QModelIndex& parent, int first, int last) override {
Q_UNUSED(parent);
TableHistory::Action action;
action.type = TableHistory::Insert;
action.row = first;
for (int column = 0; column < model()->columnCount(); ++column) {
auto item = model()->item(first, column);
action.newValue = item->data(Qt::EditRole);
}
m_history.addAction(action);
}
void rowsRemoved(const QModelIndex& parent, int first, int last) override {
Q_UNUSED(parent);
TableHistory::Action action;
action.type = TableHistory::Remove;
action.row = first;
for (int column = 0; column < model()->columnCount(); ++column) {
auto item = model()->item(first, column);
action.oldValue = item->data(Qt::EditRole);
}
m_history.addAction(action);
}
TableHistory m_history;
};
```
在这个示例代码中,我们创建了一个TableHistory类,用于存储QTableView操作的历史记录。每次进行QTableView操作时,都将操作信息添加到TableHistory类的m_history QVector中。在进行undo和redo操作时,从m_history和m_redoHistory QVector中取出最后一次操作,并执行其相应的undo或redo操作,将QTableView恢复到上一次或下一次操作的状态。
我们还创建了一个TableView类,继承自QTableView类,并重写了rowsInserted、rowsRemoved和onItemChanged等方法,以便在这些方法中添加QTableView操作的历史记录。我们还添加了undo和redo方法,用于执行撤销和回退操作。
将QTableView替换为这个新的TableView类,即可实现支持撤销回退的QTableView操作。
阅读全文