用于显示大量数据行的Qt小部件

时间:2014-01-16 10:24:59

标签: qt qt5 qtablewidget qlist

我正在尝试使用Qt(5.1)在可滚动视图中显示大量的列式记录。

我希望能够浏览的行数可以从1亿到10亿不等。

带有自定义模型的QTableWidget可以运行几百万行,但是QTableWidget为每一行分配数据,因为你可以重新调整行的高度,因此它必须为此存储数据,这可以使用兆字节甚至几千兆字节的数据。内存有100M行。

我不需要重新调整大小的行功能,只是多列列表是理想的,但QTreeCtrl似乎不适用于许多行,而QList似乎只支持单列。

我是否应该为此目的从QAbstractItemView实现自定义窗口小部件?

对于熟悉wxwidgets / wepython的人来说,可以这样做,并且可以很好地处理数十亿行:

import wx

class VirtualList(wx.ListCtrl):

    def __init__(self, parent, id, pos, size, flags):
        wx.ListCtrl.__init__(self, parent, id, pos, size, flags)

    def OnGetItemText(self, item, column):
        return "Row %d, Column %d" % (item, column)

2 个答案:

答案 0 :(得分:2)

如果是表格数据,我会使用表格。我会用自定义QAbstractTableModel编写一个自定义QTableView。在QTableView中,您可以控制所有可见项目。我会在QTableView和它的模型之间共享一些检查或变量来控制应该显示多少数据。通过覆盖QAbstractTableModel中的数据方法,您可以指定要显示的数据量。您还可以使用QTableView的滚动条来使外观更美观。

如果您不关心编辑或外观,可以使用设置为只读的简单QTextEdit / QTextBrowser。

注意:带有自定义模型的QTableWidget有点无意义。 QTableWidget和QTableView之间的主要区别在于QTableWidget拥有自己的预制模型。

答案 1 :(得分:1)

众所周知,Qt视图对大数据量的影响很慢。此处不能使用QTableWidgetQStandardItemModel,因为它们会为每个表项创建新对象。这会导致很大的开销。您应该从实现自己的快速QAbstractItemModel子类开始,并在标准QTableView中显示它。它可能会以可接受的速度运行。您还可以尝试为视图设置固定的行高,以加快速度。

如果它不起作用,您可以尝试实现自己的表视图。您也可以使用this answer中描述的图形视图框架。