2014-01-16 58 views
3

我想在使用Qt(5.1)的可滚动视图中显示大量柱状记录。比如说,我希望能够浏览的行数从1亿到1亿不等。用于显示大量数据行的Qt小部件

具有自定义模型的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) 
+1

您不需要一次分配所有1亿或10亿行,分配100或200,并且当用户在分配的100或200条记录的末尾附近滚动时,分配新记录并释放那些很远的记录来自有效行,现在查看 – Shf

+0

有'QTreeView'可以处理多行显示,并且比'QTableView'工作更快。它具有'uniformRowHeights'属性,用于保存树视图中的所有项目是否具有相同的高度,从而使视图能够进行一些优化。也允许加载数据块。并非所有数据一次。 –

+0

你可以destribe用户在哪里可以查看(真的需要查看)在一次10亿行的用户?你应该考虑数据获取。因为你不能在x86平台上运行你的程序。 –

回答

2

如果是表格数据我会用一个表。我会用自定义的QAbstractTableModel编写一个自定义的QTableView。在QTableView中,您可以控制所有可见项目。我会在QTableView和它的模型之间加入一些检查或变量来控制应该显示多少数据。通过重写QAbstractTableModel中的数据方法,您可以决定要显示多少数据。你也可以使用QTableView的滚动条来使事情看起来更好,感觉更好。

如果你真的不关心编辑或看起来,你可以使用一个简单的QTextEdit/QTextBrowser设置为只读。

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

+0

嗨HashSplat。我很难实现你的理想。您能否介绍更多或给我们一个示例项目以供参考?谢谢! – ngvntoan

1

已知Qt视图在大数据量上很慢。在这里不能使用QTableWidgetQStandardItemModel,因为它们为每个表项创建新的对象。这会导致大量开销。您应该从实施自己的快速QAbstractItemModel子类开始,并在标准QTableView中显示它。它可能会工作得很快。您也可以尝试为视图设置固定行高来加快速度。

如果它不起作用,您可以尝试实施自己的表格视图。您也可以使用this answer中描述的Graphics View Framework。