После удаления нескольких строк я пытаюсь удалить все строки, он становится очень медленным - PullRequest
0 голосов
/ 03 июля 2019

Изначально я создаю 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...