2016-02-26 73 views
1

如果你是一個Pythonist,有一個存儲在QVector<QVector<QString>> data;(或者一個列表的字符串列表)我應該如何子類QAbstractItemModel能夠顯示(只讀)這樣一個簡單的結構在QTreeView?我想看到這樣的事情:簡單的2級層次結構子類化QAbstractItemModel

  • 「組1」
    • 數據[0] [0]
    • 數據[0] [1]
  • 「組2 「
    • 數據[1] [0]
    • 數據[1] [1]

從文檔,我讀,我應該重寫index()parent()rowCount()columnCount()data()。爲了實現我的目標,這些方法的最簡單可能的實現是什麼?

爲了使可能的答案更具啓發性,一個子類QAbstractItemModel如何不使用內部指針(存儲在QModelIndex es)。我所看到的所有例子都是以樹的形式使用底層模型,節點(有指向子節點和父節點的指針),這些節點使用內部指針很容易包裝在QAbstractItemModel中。但是,即使沒有樹/節點式底層結構,也沒有QModelIndex的內部指針,我們是否可以使用QAbstractItemModel?我的問題是基於文檔說你可以使用內部指針,但我還沒有看到沒有它的任何示例。

+0

您的數據結構不足以表示2級層次結構。具體而言,頂級字符串沒有存儲空間 - 即「組1」,「組2」等。在python中,您需要使用如下形式:'[[「group1」,[1,2, 3]],[「group 2」,[1,2,3]],...]'。 – ekhumoro

+0

如果您沒有使用內部指針,那麼如何將模型索引映射到數據結構中的位置?看起來你需要使用parent()來做一個自下而上的遍歷來計算數據結構中的一系列索引,而且這個數據結構必須通過模型的幾乎所有方法不斷重新計算,這使得它(累計)非常昂貴的操作,所以也許這就是爲什麼所有的例子都是基於內部指針(這有效緩存了昂貴的查找操作)。 – ekhumoro

回答

0

這真的並不重要,你使用層次結構的哪個級別,與QVector(常用的QList <的QString >的QList類似於到std :: deque的)來存儲數據,並指向其子節點的QList <節點上創建自定義類節點 * >孩子。層次結構的頂層是不可見的根節點。然後在模型中處理數據。

真正偉大的引導,帶節點和模型的例子:

http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

基本上你可以複製粘貼代碼,並實現自己的setupModelData方法。