6.Model類
阿新 • • 發佈:2017-05-28
分享 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類