Очень медленная прокрутка PyQt5 на QTableView с пандами - PullRequest
0 голосов
/ 18 декабря 2018

Я создаю таблицу внутри PyQt5 GUI, используя QTableView.У меня есть 35 строк и 5 столбцов из кадра данных панд.Прокрутка и сортировка таблицы происходит очень медленно (порядка секунд).

Я уже искал решения, но у большинства людей возникли проблемы с заполнением таблицы.Один человек предложил использовать массив numpy, но я не увидел никакого увеличения производительности.

Вот мой код:

def create_table(dataframe):
    table = QTableView()
    tm = TableModel(dataframe)
    table.setModel(tm)

    table.setSelectionBehavior(QAbstractItemView.SelectRows)
    table.resizeColumnsToContents()
    table.resizeRowsToContents()
    table.setSortingEnabled(True)

    return table



class TableModel(QtCore.QAbstractTableModel):

    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = data

    def rowCount(self, parent=None):
        return len(self._data.values)

    def columnCount(self, parent=None):
        return self._data.columns.size

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if index.isValid():
            if role == QtCore.Qt.DisplayRole:
                return str(self._data.values[index.row()][index.column()])
        return None

    def headerData(self, rowcol, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
            return self._data.columns[rowcol]
        if orientation == QtCore.Qt.Vertical and role == QtCore.Qt.DisplayRole:
            return self._data.index[rowcol]
        return None

    def flags(self, index):
        flags = super(self.__class__, self).flags(index)
        flags |= QtCore.Qt.ItemIsEditable
        flags |= QtCore.Qt.ItemIsSelectable
        flags |= QtCore.Qt.ItemIsEnabled
        flags |= QtCore.Qt.ItemIsDragEnabled
        flags |= QtCore.Qt.ItemIsDropEnabled
        return flags

    def sort(self, Ncol, order):
        """Sort table by given column number.
        """
        try:
            self.layoutAboutToBeChanged.emit()
            self._data = self._data.sort_values(self._data.columns[Ncol], ascending=not order)
            self.layoutChanged.emit()
        except Exception as e:
            print(e)


table = create_table(dataframe)

Есть один вопрос, который я нашел здесь Медленнопрокрутка с помощью QTableView на другом компьютере , где у пользователя есть похожая проблема, и он / она обнаружил, что «QTableView обновляет элементы при каждой прокрутке / появлении окна, что, очевидно, является источником проблемы».Однако я не знаю, имеет ли моя таблица ту же проблему, что и эта.

Как можно ускорить прокрутку и сортировку для моей таблицы?Каковы источники проблемы?

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в методах rowCount и data, поскольку вы не используете лучшие функции.В случае rowCount при использовании значений вы создаете новые данные, которые потребляют время, в этом случае используйте индекс.И то же самое в данных, вы должны использовать iloc ():

def rowCount(self, parent=None):
    return len(self._data.index)

# ...

def data(self, index, role=QtCore.Qt.DisplayRole):
    if index.isValid():
        if role == QtCore.Qt.DisplayRole:
            return str(self._data.iloc[index.row(), index.column()])
    return None
...