Изначально я создаю QTableView
с множеством строк внутри и использую QStandardItemModel
для управления данными.Включить сортировку по setSortingEnabled(True)
.После сортировки данных, нажав на заголовок, я пытаюсь удалить все строки, но это становится очень медленно.Я решил эту проблему с QSortFilterProxy
.Но я не знаю, почему ...
Теперь еще один вопрос: если я сначала удаляю несколько строк, а затем пытаюсь выбрать и удалить все строки, он становится очень медленным.
class Dialog(QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setAttribute(Qt.WA_DeleteOnClose)
self.setWindowTitle("Test")
self._layout = QVBoxLayout(self)
self._layout.setAlignment(Qt.AlignLeft)
self.table = QTableView(self)
self.table.setSortingEnabled(True)
self.model = QStandardItemModel(self)
for i in range(10000):
lst = [QStandardItem('Test %s,%s' % (i, j)) for j in range(46)]
self.model.appendRow(lst)
sortProxy = QSortFilterProxyModel(self)
sortProxy.setSourceModel(self.model)
self.table.setModel(sortProxy)
btLayout = QHBoxLayout()
deleteBt = QPushButton(self)
deleteBt.setText('Delete All')
delete10 = QPushButton(self)
delete10.setText('Delete 10 rows')
deleteBt.clicked.connect(self.deleteRows)
delete10.clicked.connect(self.delete10Rows)
self._layout.addWidget(self.table)
self._layout.addLayout(btLayout)
btLayout.addWidget(deleteBt)
btLayout.addWidget(delete10)
btLayout.addStretch()
def delete10Rows(self):
self.table.model().removeRows(10, 10)
# After delete 10 rows, then select and delete all rows, it's extremely slow
# But if I delete all rows directly, the problem won't apear
def deleteRows(self):
selectModel = self.table.selectionModel()
selectedRows = selectModel.selectedRows()
if len(selectedRows) == 0:
return
selectedRows.sort(key=lambda x: x.row(), reverse=True)
for index in selectedRows:
self.table.model().removeRow(index.row())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Dialog()
main.show()
sys.exit(app.exec_())