1. 程式人生 > >6.Model類

6.Model類

分享 log 訪問 top png per 可能 columns mage

Basic Concepts 在Model/View結構中,Model提供標準的接口讓View和Delegate獲得數據。在QT中,標準的接口都被定義在QAbstractItemModel類中。不論數據如何存儲在底層的數據結構中,任何QAbstractItemModel的子類,將數據表示為表或者樹等層次結構。 View很方便的獲得Model中的Item Data,但是這些數據顯示給用戶時候,並不需要嚴格的以表或者樹等形式顯示。     技術分享      Model也告知那些關聯的View數據改變,通過信號和槽機制。   本章介紹基礎概念: 其他組件如何通過Model類獲取到 Item Data的? Model Index
為了數據的呈現和數據的訪問方式保持獨立,引入了Model Index概念。通過Model獲得任何一條信息,都由Model Index表示。View和Delegate使用Index獲得數據,然後顯示出來。 其結果是,只有Model類知道需要如何得到數據,Model類所處理的數據類型也可以被定義的相當普遍。Model Index包含一個指向Model(創建Model Index的Model)的指針,這個指針避免了使用多個Model時產生混亂。 QAbstractItemModel *model = index.model(); 由於Model可能會時不時的重組內部結構,此時Model Index變無效,也沒有必要保存。如果要長期的保存對某數據的引用,Persistent Model Index 將被創建,它提供了Model中數據的最新信息。臨時的Model Index由QModelIndex類創建,持續的Model Index由QPersistentModelIndex創建。 為了獲得與Model Index相對應的數據,Model中三個屬性必須具體指定: Row、Column、Model Index of a parent item。
Rows and Columns 在最基本的形式,一個Model可以作為一個表被訪問,這個表指定了行數和列數。這不意味底層的數據也被存儲在類似表的數據結構中。Model以表格形式,只是為了組件之間的通訊更方便。給定行和列,我們能得到指定的Item Date,也能得到這個Item Date的Model Index。 QModelIndex QAbstractItemModel::index(int row, int column, QModelIndex &parent = QModelIndex() ) const [ pure virtual]         技術分享
  QModelIndex indexA = model->index(0, 0, QModelIndex() );   QModelIndex indexB = model->index(1, 1, QModelIndex() );   QModelIndex indexC = model->index(2, 1, QModelIndex() );   為什麽總把QModelIndex()作為父類的引用,將在下一節討論。 Parent of Items 在Table或者List Model中數據和數據將在View中顯示的位置完全一致,這是一種理想狀態。但是在Tree Model中,需要更靈活的接口。因此頂級的Model Index能作為下面的Model Index 父類。如下圖所示:     技術分享        QModelIndex indexA = modex->index(0, 0, QModexIndex() ); QModelIndex indexC = modex->index(2, 1, QModexIndex() ); 查看Qt文檔。QModexIndex::QModexIndex() 構造函數創建一個空的ModelIndex,因為A和C都是Top-level,所以可以認為父類的QModexIndex為空 而對於B來說 QModelIndex indexB = modex->index(1, 0, indexA ); 父類的ModelIndex就是indexA Item Roles 在Model中的數據以不同的角色劃分,例如Qt::DisplayRole就是獲得字符串,然後在View中顯示出來。其他的角色詳見Qt::ItemDataRole。 我們能夠根據Model Index和Role獲得我們想要的類型的數據。 QVariant value = model->data(index, role); 總結: 1.ModelIndex提供給View和Delegata 數據信息。Model是List、Table、Tree形式,和底層的數據存儲在哪裏,如何存儲無關。 2.獲得ModelIndex 需要3個參數,Row,Column,Parent Modex Index of Item。 3.Model根據其他組件(例如:View Delegate)的需求,創建ModelIndex。 4.Top-level ModelIndex : model->index(row, column, QModelIndex() ) 5.子ModelIndex : model->index(row, column, indexParent ) 6.Qt::ItemDataRole 區分數據

6.Model類