我正在尝试使用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)
答案 0 :(得分:2)
如果是表格数据,我会使用表格。我会用自定义QAbstractTableModel编写一个自定义QTableView。在QTableView中,您可以控制所有可见项目。我会在QTableView和它的模型之间共享一些检查或变量来控制应该显示多少数据。通过覆盖QAbstractTableModel中的数据方法,您可以指定要显示的数据量。您还可以使用QTableView的滚动条来使外观更美观。
如果您不关心编辑或外观,可以使用设置为只读的简单QTextEdit / QTextBrowser。
注意:带有自定义模型的QTableWidget有点无意义。 QTableWidget和QTableView之间的主要区别在于QTableWidget拥有自己的预制模型。
答案 1 :(得分:1)
众所周知,Qt视图对大数据量的影响很慢。此处不能使用QTableWidget
或QStandardItemModel
,因为它们会为每个表项创建新对象。这会导致很大的开销。您应该从实现自己的快速QAbstractItemModel
子类开始,并在标准QTableView
中显示它。它可能会以可接受的速度运行。您还可以尝试为视图设置固定的行高,以加快速度。
如果它不起作用,您可以尝试实现自己的表视图。您也可以使用this answer中描述的图形视图框架。