QModelIndex/Role/Model介紹<二>

QModelIndex/Role/Model介紹<二>

Model類

基本概念
在model/view構架中,model爲view和delegates使用數據提供了標準接口。在Qt中,標準接口QAbstractItemModel類中被定義。無論數據在底層以何種數據結構存儲,QAabstractItemModel的子類會以層次結構的形式來表示數據,結構中包含了數據項表。咱們按這種約定來訪問model中的數據項,但這個約定不會對如何顯示這些數據有任何限制。數據發生改變時,model經過信號槽機制來通知關聯的views。

數組

Model Indexes 數據結構

爲了使數據存儲與數據訪問分開,引入了model index的概念。經過model index,能夠引用model中的數據項,Views和delegates都使用indexes來訪問數據項,而後再顯示出來。所以,只有model須要瞭解如何獲取數據,被model管理的數據類型能夠很是普遍地被定義。Model indexes包含一個指向建立它們的model的指針,這會在配合多個model工做時避免混亂。
QAbstractItemModel *model = index.model(); 函數

model indexes提供了對一項數據信息的臨時引用,經過它能夠訪問或是修改model中的數據。既然model有時會從新組織內部的數據結構,這時model indexes便會失效,所以不該該保存臨時的model indexes。假如須要一個對數據信息的長期的引用,那麼應該建立一個persistent model index。這個引用會保持更新。臨時的model indexes由QModelIndex提供,而具備持久能力的model indexes則由QPersistentModelIndex提供。在獲取對應一個數據項的model index時,須要考慮有關於model的三個屬性:行數,列數,父項的model index。 spa


行與列

在最基本的形式中,一個model可做爲一個簡單的表來訪問,每一個數據項由行,列數來定位。這必不意味着
底層的數據用數組結構來存儲。行和列的使用僅僅是一種約定,它容許組件之間相互通信。能夠經過指定
model中的行列數來獲取任一項數據,能夠獲得與數據項一一對應的那個index。
QModelIndex index = model->index(row, column, ...);
Model爲簡單的,單級的數據結構如list與tables提供了接口,它們如上面代碼所顯示的那樣,再也不須要別的信息被提供。當咱們在獲取一個model index時,咱們須要提供另外的信息。
指針

上圖表明一個基本的table model,它的每一項用一對行列數來定位。經過行列數,能夠獲取表明一個數據項的model index . 
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexB = model->index(1, 1, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
一個model的頂級項,由QModelIndex()取得,它們上式被用做父項。 接口

父項

相似於表的接口在搭配使用table或list view時理想的,這種行列系統與view顯示的方式是確切匹配的。
然則,像tree views這種結構須要model提供更爲靈活的接口來訪問數據項。每一個數據項多是別的項的
父項,上級的項能夠獲取下級項的列表。
當獲取model中數據項的index時,咱們必須指定關於數據項的父項的信息。在model外部,引用一個數據
項的惟一方法就是經過model index,所以須要在求取model index時指定父項的信息。
QModelIndex index = model->index(row, column, parent);
字符串

上圖中,A項和C項做爲model中頂層的兄弟項:
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());
A有許多孩子,它的一個孩子B用如下代碼獲取:
QModelIndex indexB = model->index(1, 0, indexA);

項角色

model中的項能夠做爲各類角色來使用,這容許爲不一樣的環境提供不一樣的數據。舉例來講,Qt::DisplayRole被用於訪問一個字符串,它做爲文本會在view中顯示。典型地,每一個數據項均可覺得許多不一樣的角色提供數據,標準的角色在Qt::ItemDataRole中定義。咱們能夠經過指定model index與角色來獲取咱們須要的數據:
QVariant value = model->data(index, role);
get

角色指出了從model中引用哪一種類型的數據。views能夠用不一樣的形式顯示角色,所以爲每一個角色提供正確
的信息是很是重要的。經過爲每一個角色提供適當數據,model也爲views和delegates提供了暗示,如何正確地
把這些數據項顯給用戶。不一樣的views能夠自由地解析或忽略這些數據信息,對於特殊的場合,也能夠定義
一些附加的角色。

概念總結:
1,Model indexes爲views與delegages提供model中數據項定位的信息,它與底層的數據結構無關。
2,經過指定行,列數,父項的model index來引用數據項。
3,依照別的組件的要求,model indexes被model構建。
4,使用index()時,若是指定了有效的父項的model index,那麼返回獲得的model index對應於父項的某個孩子。
5,使用index()時,若是指定了無效的父項的model index,那麼返回獲得的model index對應於頂層項的某個孩子。
6, 角色對一個數據項包含的不一樣類型的數據給出了區分。 table

使用Model Indexes

     QDirModel *model = new QDirModel;
     QModelIndex parentIndex = model->index(QDir::currentPath());
     int numRows = model->rowCount(parentIndex);
    for (int row = 0; row < numRows; ++row) {
         QModelIndex index = model->index(row, 0, parentIndex);
         tring text = model->data(index, Qt::DisplayRole).toString();
         // Display the text in a widget. model

     } 以上的例子說明了從model中獲取數據的基本原則: 1 model的尺寸能夠從rowCount()與columnCount()中得出。這些函數一般都須要一個表示父項的model index。 2 model indexes用來從model中訪問數據項,數據項用行,列,父項model index定位。 3 爲了訪問model頂層項,可使用QModelIndex()指定。 4 數據項爲不一樣的角色提供不一樣的數據。爲了獲取數據,除了model index以外,還要指定角色。

相關文章
相關標籤/搜索