【发布时间】:2012-08-19 01:06:47
【问题描述】:
我需要使用 PyQt 类 QTableWidget 显示数据。但可能有几十万行。显示整个工作表会使应用程序挂起...
所以我找到了一个解决方案,包括加载数据(意味着创建工作表)但隐藏大部分行,并且在移动滚动条时显示新行并隐藏以前的行。
在下面的代码中,我设置了self.rowsShown = 50,并在初始化时显示了从 1 到 50 的行。而我之前做过self.verticalScrollBar().actionTriggered.connect(self.refreshDisplay)。
所以代码是:
def refreshDisplay(self):
"""
This is to refresh the display when the scrollbar is moved
"""
# Minimum is reached and a previous row exists
if self.verticalScrollBar().value() <= self.verticalScrollBar().minimum() and self.isRowHidden(self.firstRowShown-1):# Minimum is reached and a previous row exists
for row in xrange(self.lastRowShown-1, self.lastRowShown):
self.hideRow(row)
self.lastRowShown -= 1
for row in xrange(self.firstRowShown-1, self.firstRowShown):
self.showRow(row)
self.firstRowShown -= 1
# Maximum is reached and a next row exists
if self.verticalScrollBar().value() >= self.verticalScrollBar().maximum() and self.isRowHidden(self.lastRowShown+1):
for row in xrange(self.firstRowShown, self.firstRowShown+1):
self.hideRow(row)
self.firstRowShown += 1
for row in xrange(self.lastRowShown, self.lastRowShown+1):
self.showRow(row)
self.lastRowShown += 1
当我使用鼠标滚动或单击滚动条的按钮时,这非常有效。但是当我抓住滑块或使用键盘移动选定的案例时,我被挡在了显示的区域中。
此外,滚动区域的大小仅对应于显示的行。我想重新定义它以设置我自己的栏(例如,使用基于实际行数的大小),以便我可以快速移动到工作表的另一部分。但是滚动条的大小总是随着显示的行数而更新。
所以,我希望你能帮我解决这两个问题,或者给我另一个想法来展示这么大的表格。也许我错过了一个已经具有在移动光标时加载/显示行的功能的模块或类。
谢谢
【问题讨论】:
-
你试过QTableView吗?
-
QTableWidget继承自QTableView。所以,我在这里使用的hideRow()和showRow()函数来自QTableView。
标签: python pyqt qtableview qtablewidget