【发布时间】:2016-12-29 03:24:13
【问题描述】:
这是我用来填充在 QT Designer 中绘制的表格的代码。 设计为适用于任何桌子,它工作正常,但是...... 当我尝试显示包含 18 列和 ~12000 行的数据时,它只会冻结 30 秒或更长时间。 那么,我做错了什么,有没有办法加快速度,让代码仍然适用于任何表格?
这是我的代码:
...blablabla...
self.connect(self, SIGNAL("set"), self.real_set)
...blablabla...
def set_table(self, table, data):
self.emit(SIGNAL('set'), table, data)
def real_set(self, table, data):
"""
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Assuming data is list of dict and table is a QTableWidget.
Get first key and get len of contents
"""
for key in data:
rows = len(data[key])
table.setRowCount(rows)
break
"""
Forbid resizing(speeds up)
"""
table.horizontalHeader().setResizeMode(QHeaderView.Fixed)
table.verticalHeader().setResizeMode(QHeaderView.Fixed)
table.horizontalHeader().setStretchLastSection(False)
table.verticalHeader().setStretchLastSection(False)
"""
Set number of columns too
"""
table.setColumnCount(len(data))
table.setHorizontalHeaderLabels(sorted(data.keys()))
"""
Now fill data
"""
for n, key in enumerate(sorted(data.keys())):
for m, item in enumerate(data[key]):
newitem = QTableWidgetItem(item)
table.setItem(m, n, newitem)
【问题讨论】:
-
你的意思是在标题中说
QTableWidget?因为您似乎在代码中使用了QTableWidgetItem...另外,更完整的代码会很好,因为现在不知道table或item的类型是什么。 -
您不能一次添加所有 12000 个项目,因为这会阻塞事件循环太长时间。在那个答案中给出的分页解决方案的技术是可行的,但不是通过用户操作进行分页,您可以只使用一个间隔为 0 的计时器,并添加一些合适数量的项目(通用解决方案是在运行时计时,并在您花费 100 毫秒添加项目时停止为该超时添加项目。然后在下次触发计时器超时时继续)。这样 Qt 事件循环可以继续运行,并且 GUI 可以工作。
-
@pmus。一张 18x12000 的桌子非常小。填充它不应该花费近 30 秒的时间。在我自己的测试中,一张 20x15000 的表格只需要 3-4 秒就可以填满。您需要提供一个显示性能问题的完整示例,以便其他人可以尝试重现它。
-
@hyde。我的测试使用了一个随机数据集,在填充表格后结果包括
sortByColumn。必须有一些其他代码,OP 没有显示是导致速度变慢的原因。 -
@pmus。如果您将
QTableView与直接从数据结构中提取值的自定义模型一起使用,您可以获得更好的性能。主要瓶颈是创建QTableWidgetItem的所有这些实例。在我的测试中,使用自定义模型时,一张 20x15000 的表格只需要几分之一秒的时间就可以填满。
标签: python qt pyqt qtablewidget