2014-01-16 84 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。