在 QAbstractTableModel 的 RemoveRow 中删除多行并刷新 - Pyside2

问题描述 投票:0回答:0

我有一个使用 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
python user-interface pyside2 qtableview qabstracttablemodel
© www.soinside.com 2019 - 2024. All rights reserved.