使用QTableWidget显示大量工作表

时间:2012-08-23 13:39:07

标签: python pyqt qtableview qtablewidget

我需要使用PyQt类QTableWidget显示数据。但可能会有数十万行。显示整个工作表使appli挂起......

所以我找到了一个解决方案,包括加载数据(意味着创建工作表)但隐藏了大部分行,并且在移动滚动条时,显示新行并隐藏以前的行。

在下面的代码中,我设置了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

当我使用鼠标滚动或单击滚动条的按钮时,这非常有效。但是当我抓住滑块或使用键盘移动所选的外壳时,我在所示区域被阻挡。

此外,滚动区域的大小对应于仅显示的行。我想重新设置它来设置我自己的栏(例如,基于实际行数的大小),以便我可以快速移动到工作表的另一部分。但滚动条的大小总是随着显示的行数更新。

所以,我对你的期望是帮助我解决这两个问题,或者给我另一个想法来展示如此庞大的表格。也许我错过了一个模块或类,它已经具有在移动光标时加载/显示行的功能。

由于

1 个答案:

答案 0 :(得分:2)

我编写了一个工具,在类似Excel的表中显示10 ^ 6 +行,没有资源问题。解决方案是使用QTableViewQAbstractTableModel。您必须从QAbstractTableModel派生并实现它需要您实现的必要功能(我记得headerDatadata,但我认为还有更多)。然后,您可以通过执行view.setModel(model)将模型插入到视图中。有关如何完成此操作的详细信息,请参见here