支持撤销回退的QTableView复杂表格,通过继承QStandardItemModel来实现
时间: 2024-02-01 10:14:29 浏览: 53
实现支持撤销回退的QTableView复杂表格,可以继承QStandardItemModel来实现。具体实现步骤如下:
1. 继承QStandardItemModel类,并添加撤销回退功能
```python
class UndoRedoStandardItemModel(QStandardItemModel):
def __init__(self, parent=None):
super(UndoRedoStandardItemModel, self).__init__(parent)
self.undoStack = QUndoStack(self)
self.itemChanged.connect(self.itemChangedHandler)
def itemChangedHandler(self, item):
command = ItemChangedCommand(item)
self.undoStack.push(command)
def undo(self):
self.undoStack.undo()
def redo(self):
self.undoStack.redo()
```
在继承的类中,我们添加了一个`undoStack`属性,用来存储操作记录。在每次表格内容被修改时,我们创建一个`ItemChangedCommand`对象,并将其压入`undoStack`中,以便于后续的撤销和回退操作。
2. 实现撤销回退操作对应的命令类
```python
class ItemChangedCommand(QUndoCommand):
def __init__(self, item):
super(ItemChangedCommand, self).__init__()
self.item = item
self.oldValue = item.data(Qt.EditRole)
def redo(self):
self.item.setData(self.item.data(Qt.EditRole), Qt.EditRole)
def undo(self):
self.item.setData(self.oldValue, Qt.EditRole)
```
在命令类中,我们记录了修改前的值`oldValue`,并在`undo`和`redo`方法中进行相应的操作。
3. 构建QTableView并设置数据模型
```python
tableModel = UndoRedoStandardItemModel()
tableView = QTableView()
tableView.setModel(tableModel)
```
在构造QTableView时,我们将上述继承的`UndoRedoStandardItemModel`类作为数据模型传入QTableView中。
通过以上步骤,我们实现了一个支持撤销回退的复杂表格。在表格中修改数据后,可以通过`undo`和`redo`方法进行相应的操作。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)