pyqt如何获取tableview中被修改数据的位置
时间: 2024-02-05 12:04:57 浏览: 142
在 `QTableView` 中,如果用户编辑了某个单元格并保存了数据,那么会触发 `QAbstractItemModel` 的 `setData()` 方法,我们可以在该方法中获取到被修改的单元格的索引,从而确定被修改的位置。
具体的实现方式如下:
```python
class MyTableModel(QAbstractTableModel):
def setData(self, index, value, role):
if role == Qt.EditRole:
# 获取被修改的单元格的索引和数据
row = index.row()
column = index.column()
old_data = self.data(index, Qt.DisplayRole)
new_data = value
# 更新数据
self._data[row][column] = new_data
# 发送数据变更信号
self.dataChanged.emit(index, index, [Qt.DisplayRole])
# 打印被修改的位置
print(f"数据从{old_data}修改为{new_data},位置为({row}, {column})")
return True
return False
```
在上述代码中,我们首先获取被修改的单元格的索引和数据,然后更新数据并发射数据变更信号。最后,我们打印出被修改的位置信息,即行列索引。
需要注意的是,如果用户修改了某一行或某一列的所有单元格,那么会依次调用 `setData()` 方法,此时我们需要记录下被修改的位置信息,并在最后一次调用 `setData()` 方法时打印出位置信息。可以在 `MyTableModel` 的 `__init__()` 方法中添加一个成员变量 `_last_modified_index`,记录下最后一次被修改的单元格的索引,然后在 `setData()` 方法中进行判断,如果当前修改的单元格和上一次修改的单元格在同一行或同一列,那么就不打印位置信息,否则打印位置信息。具体实现方式如下:
```python
class MyTableModel(QAbstractTableModel):
def __init__(self, data, parent=None):
super().__init__(parent)
self._data = data
self._last_modified_index = None
def setData(self, index, value, role):
if role == Qt.EditRole:
# 获取被修改的单元格的索引和数据
row = index.row()
column = index.column()
old_data = self.data(index, Qt.DisplayRole)
new_data = value
# 更新数据
self._data[row][column] = new_data
# 记录被修改的索引
if self._last_modified_index is None:
self._last_modified_index = index
else:
last_row = self._last_modified_index.row()
last_column = self._last_modified_index.column()
if row != last_row and column != last_column:
print(f"数据从{old_data}修改为{new_data},位置为({row}, {column})")
self._last_modified_index = index
# 发送数据变更信号
self.dataChanged.emit(index, index, [Qt.DisplayRole])
return True
return False
```
在上述代码中,我们使用 `_last_modified_index` 成员变量记录最后一次被修改的单元格的索引。当新的单元格被修改时,我们判断新的单元格和上一个被修改的单元格是否在同一行或同一列,如果不是,则打印位置信息并更新 `_last_modified_index`。这样就能够正确地获取被修改的单元格的位置信息了。
阅读全文