滚动大型数据集时,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)