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。
行與列
在最基本的形式中,乙個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);
角色指出了從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, 角色對乙個資料項包含的不同型別的資料給出了區分。
使用model indexes
qdirmodel *model = new qdirmodel ;
qmodelindex parentindex = model->index (qdir::currentpath());
int numrows = model->rowcount (parentindex);
for (int row = 0; row < numrows; ++row)
以上的例子說明了從model中獲取資料的基本原則:
1,model的尺寸可以從rowcount ()與columncount ()中得出。這些函式通常都需要乙個表示父項的model index。
2,model indexes用來從model中訪問資料項,資料項用行,列,父項model index定位。
3, 為了訪問model頂層項,可以使用qmodelindex ()指定。
4, 資料項為不同的角色提供不同的資料。為了獲取資料,除了model index之外,還要指定角色。
Qt Model View 學習筆記 五
view 類 概念 在model view架構中,view從model中獲得資料項然後顯示給使用者。資料顯示的方式不必與model提供的表示方式相同,可以與底層儲存資料項的資料結構完全不同。內容與顯式的分離是通過由qabstractitemmodel 提供的標準模型介面,由qasbstractite...
Qt Model View 學習筆記 五
view 類 概念 在model view架構中,view從model中獲得資料項然後顯示給使用者。資料顯示的方式不必與model提供的表示方式相同,可以與底層儲存資料項的資料結構完全不同。內容與顯式的分離是通過由qabstractitemmodel提供的標準模型介面,由qasbstractitem...
Qt Model View 學習筆記 四
qt model view 學習筆記 2010 06 28 12 42 03 閱讀38 字型大小 大中小 訂閱建立新的models 介紹 model view元件之間功能的分離,允許建立model利用現成的views。這也可以使用標準的功能 圖形使用者介面元件像qlistview,qtablevie...