滚动大型数据集时,PyQt QTableView 速度非常慢

Posted

技术标签:

【中文标题】滚动大型数据集时,PyQt QTableView 速度非常慢【英文标题】:PyQt QTableView prohibitively slow when scrolling with large data sets 【发布时间】:2015-07-23 13:19:18 【问题描述】:

我有一个程序可以从 csv 文件加载配置文件并在表格中显示数据。将 pandas 数据框加载到表中非常快,因为我使用了 QAbstractTableModel 的自定义模型实现,但是 QTableView 小部件的大小调整非常慢。

如何使调整大小和滚动更顺畅?

【问题讨论】:

显示你的尝试!!!我们无法猜测问题 不清楚吗?我在一个表中加载了 10k 行并且滚动需要永远,你需要什么代码,将模型设置为表的代码?在其他语言中有渲染控制的使能,但我不知道如何在 QT 环境中做到这一点。 C++ 中的类似问题:QTableView slow performance with 1000s of visible cells 使用QTreeView 更糟糕,还有uniformRowHeight 技巧。 【参考方案1】:

好吧,我最终修改了使用 numpy 制作的自定义表模型,现在它速度非常快。

2020 年 2 月 22 日更新 从 Pandas 1.0.1 开始工作:

使用此表模型:

import numpy as np

class PandasModel(QtCore.QAbstractTableModel):
    """
    Class to populate a table view with a pandas dataframe
    """
    def __init__(self, data, parent=None):
        QtCore.QAbstractTableModel.__init__(self, parent)
        self._data = np.array(data.values)
        self._cols = data.columns
        self.r, self.c = np.shape(self._data)

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

    def columnCount(self, parent=None):
        return self.c

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


    def headerData(self, p_int, orientation, role):
        if role == QtCore.Qt.DisplayRole:
            if orientation == QtCore.Qt.Horizontal:
                return self._cols[p_int]
            elif orientation == QtCore.Qt.Vertical:
                return p_int
        return None

【讨论】:

return self._data[index.row(),index.column()] 根本不适合我。从scipy.org a.item(*args) 与 a[args] 非常相似,除了返回标准 Python 标量而不是数组标量。这对于加快对数组元素的访问以及使用 Python 的优化数学对数组元素进行算术运算非常有用。因此我使用了row_column = tuple([index.row(),index.column()])return self._data.item(row_column)

以上是关于滚动大型数据集时,PyQt QTableView 速度非常慢的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据发送到 QTableView/QTableWidget (PyQt)

PySide/pyQt 在 QTableView 中显示数据

PyQt.QTableView 内容的单元测试

QTableView 标题菜单位置

PyQt4 qTableView 对齐

PyQt5 组件之QTableView