我有一个使用 QAbstractTableModel 的 QTableView,我正在尝试创建一些删除行功能。我在 removeRow 代码中写了这样的 -
def removeRows(self, row, count, parent=QtCore.QModelIndex()):
self.beginRemoveRows(parent, row, row + count - 1)
for i in range(count):
del self._data[row]
self.endRemoveRows()
return True
调用 removeRow 时,它不会立即刷新表格,它只会在我单击表格上的某个位置后刷新。删除运行后是否需要调用 layoutChanged.emit()?如果我正在调用 layoutChanged,我是否需要调用 layoutAboutToBeChanged?
我还希望能够删除不在跨度内的行。就像用户 cntrl 选择了随机行(例如可能是第 1 行和第 7 行)。显然,这被设计为仅删除跨度中的行,因此不确定是否可以在随机位置删除它们。
编辑: 所以我想我能够将它设置为在给出行列表时删除随机行,它似乎正在工作。
def removeRows(self, row_indexes, parent=QtCore.QModelIndex()):
self.layoutAboutToBeChanged.emit()
row_indexes.sort(reverse=True)
for row in row_indexes:
self.beginRemoveRows(parent, row, row)
del self._data[row]
self.endRemoveRows()
self.layoutChanged.emit()
return True
我就是这样做的
row_index = set()
selected_rows = self.output.selectedIndexes()
for row in selected_rows:
row_index.add(row.row())
self.model.removeRows(list(row_index), self.output_list.currentIndex())
我在删除之前和之后添加了 layoutToBeChanged.emit() 和 layoutchanged.emit() ,现在正在刷新表格。不确定这是否是正确的方法,没有 layoutchange 它不会自动刷新它。
这是我的整个 QabstractTableModel 类
class FileTableModel(QtCore.QAbstractTableModel):
def __init__(self, data):
super(FileTableModel, self).__init__()
self._data = data
self.headers = ['File Name', 'Path', 'File Size', 'Modified Date', 'Creation Date']
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
value = self._data[index.row()][index.column()]
if isinstance(value, datetime):
return datetime.strftime(value, "%m/%d/%Y %X %p")
elif isinstance(value, int):
return size_conversion(value)
else:
return value
def rowCount(self, index):
return len(self._data)
def columnCount(self, index):
return len(self._data[0])
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
return self.headers[section]
def sort(self, column, order=QtCore.Qt.AscendingOrder):
self.layoutAboutToBeChanged.emit()
self._data.sort(key=lambda x: x[column], reverse=order == QtCore.Qt.DescendingOrder)
self.layoutChanged.emit()
def removeRows(self, row_indexes, parent=QtCore.QModelIndex()):
self.layoutAboutToBeChanged.emit()
row_indexes.sort(reverse=True)
for row in row_indexes:
self.beginRemoveRows(parent, row, row)
del self._data[row]
self.endRemoveRows()
self.layoutChanged.emit()
return True