Qt Model View 學習筆記 三

2021-06-24 11:11:40 字數 3512 閱讀 4810

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...