QTableView horizontalHeader делает его очень медленным? - PullRequest
1 голос
/ 08 мая 2019

У меня есть код ниже, и я заметил, что, когда я нажимаю Ctrl + A, чтобы выделить все строки, он чувствует себя запаздывающим, что занимает около 1 секунды для завершения выбора.Однако я также заметил, что если я скрываю горизонтальный заголовок с помощью self.horizontalHeader().hide(), отставание полностью исчезает!Почему это происходит?И как я могу избавиться от лага, но сохранить свой заголовок?

from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import Qt
import pandas as pd
import numpy as np
import sys

class SeriesModel(QtCore.QAbstractTableModel):
    def __init__(self, series):
        super().__init__()
        self.series = series

    def columnCount(self, parent=None):
        return 1

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

    def data(self, index, role=None):
        row = index.row()
        col = index.column()
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.ToolTipRole:
            return str(self.series[row])

    # The headers of this table will show the level names of the MultiIndex
    def headerData(self, section, orientation, role=None):
        if role in [QtCore.Qt.DisplayRole, QtCore.Qt.ToolTipRole]:
            if orientation == Qt.Horizontal:
                return str(self.series.name)

class SeriesView(QtWidgets.QTableView):
    def __init__(self, series):
        super().__init__()

        self.setModel(SeriesModel(series))

        # self.horizontalHeader().hide()

# Examples
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    series = pd.Series(np.random.randn(1000000)).rename('MyData')

    view = SeriesView(series)
    view.show()

    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 08 мая 2019

Проблема в том, что свойство highlightSections включено по умолчанию в заголовке QTableView.Это свойство означает, что если выбран элемент, также выбирается элемент в заголовке, который подразумевает перерисовку, в вашем случае у вас есть 1000000, поэтому он будет перекрашиваться аналогичное количество раз.Поэтому возможное решение состоит в том, чтобы отключить это свойство:

class SeriesView(QtWidgets.QTableView):
    def __init__(self, series):
        super().__init__()
        self.setModel(SeriesModel(series))
        self.horizontalHeader().setHighlightSections(False)
...