Qt Model View 學習筆記 四

2021-04-21 22:36:09 字數 4096 閱讀 9570

建立新的models

介紹

model/view元件之間功能的分離,允許建立model利用現成的views。這也可以使用標準的功能 圖形使用者介面元件像qlistview,qtableview和qtreeview來顯示來自各種資料來源的資料為。

qabstractlistmodel類提供了非常靈活的介面,允許資料來源以層次結構的形式來管理資訊,也允許以某種

方式對資料進行插入、刪除、修改和儲存。它也提供了對拖拽操作的支援。

qabstractlistmodel與

qabstracttablemodel為簡單的非層次結構的資料提供了介面,對於比較簡單的list和table models來說,這是不錯的乙個開始點。

設計乙個model

當我們為存在的資料結構新建乙個model時,首先要考慮的問題是應該選用哪種model來為這些資料提供介面。

假如資料結構可以用資料項的列表或表來表示,那麼可以考慮子類化

qabstractlistmodel或

qabstracttablemodel

,既然這些類已經合理地對許多功能提供預設實現。

然而,假如底層的資料結構只能表示成具有層次結構的樹型結構,那麼必須得子類化

qabstractitemmodel。

無論底層的資料結構採取何種形式,在特定的model中實現標準的

qabstractitemmodel api總是乙個不錯的主意,這使得可以使用更自然的方式對底層的資料結構進行訪問。這也使得用資料構建model 更為容易,其他

的model/view元件也可以使用標準的api與之進行互動。

乙個唯讀model示例

這個示例實現了乙個簡單的,非層次結構的,唯讀的資料model,它基於

qstringistmodel類。它有乙個

qstringlist作為它內部的資料來源,只實現了一些必要的介面。為了簡單化,它子類化了

qabstractlistmodel,這個基類提供了合理的預設行為,對外提供了比

qabstractitemmodel更為簡單的介面。當我們實現乙個model時,不要忘了

qabstractitemmodel本身不儲存任何資料,它僅僅提供了給views訪問

資料的介面。

class

stringlistmodel : public

qabstractlistmodel

int rowcount(const qmodelindex &parent = qmodelindex()) const;

qvariant data(const qmodelindex &index, int role) const;

qvariant headerdata(int section, qt::orientation orientation,

int role = qt::displayrole) const;

private:

qstringlist stringlist;

};除了建構函式,我們僅需要實現兩個函式:rowcount()返回model中的行數,data()返回與特定model index對應的資料項。具有良好行為的model也會實現headerdata(),它返回tree和table views需要的,在標題中顯示的資料。

因為這是乙個非層次結構的model,我們不必考慮父子關係。假如model具有層次結構,我們也應該實現index()與parent()函式。

model的尺寸

我們認為model中的行數與string list中的string數目一致:

int stringlistmodel::rowcount(const qmodelindex &parent) const

在預設情況下,從qabstractlistmodel派生的model只具有一列,因此不需要實現columncount()。

model 標題與資料

qvariant stringlistmodel::data(const qmodelindex &index, int role) const

qvariant stringlistmodel::headerdata(int section, qt::orientation orientation,

int role) const

乙個資料項可能有多個角色,根據角色的不同輸出不同的資料。上例中,model中的資料項只有乙個角色 ,

displayrole,然而我們也可以重用提供給displayrole的資料,作為別的角色使用,如我們可以作為tooltiprole來用。

可編輯的model

上面我們演示了乙個唯讀的model,它只用於向使用者顯示,對於許多程式來說,可編輯的list model可能更有用。我們只需要給唯讀的model提供另外兩個函式flags()與setdata()的實現。下列函式宣告被新增到類定義中:

qt::itemflags

flags(const qmodelindex &index) const;

bool setdata(const qmodelindex &index, const qvariant &value,

int role = qt::editrole);

讓model可編輯

delegate會在建立編輯器之前檢查資料項是否是可編輯的。model必須得讓delegate知道它的資料項是可

編輯的。這可以通過為每乙個資料項返回乙個正確的標記得到,在本例中,我們假設所有的資料項都是

可編輯可選擇的:

qt::itemflags

stringlistmodel::flags(const qmodelindex &index) const

我們不必知道delegate執行怎樣實際的編輯處理過程,我們只需提供給delegate乙個方法,delegate會使用它對model中的資料進行設定。這個特殊的函式就是setdata():

bool stringlistmodel::setdata(const qmodelindex &index,

const qvariant &value, int role)

return false;

}當資料被設定後,model必須得讓views知道一些資料發生了變化,這可通過發射乙個datachanged() 訊號實現。

因為只有乙個資料項發生了變化,因此在訊號中說明的變化範圍只限於乙個model index。

插入,刪除行

在model中改變行數與列數是可能的。當然在本列中,只考慮行的情況,我們只需要重新實現插入、刪除

的函式就可以了,下面應在類定義中宣告:

bool insertrows(int position, int rows, const qmodelindex &index = qmodelindex());

bool removerows(int position, int rows, const qmodelindex &index = qmodelindex());

既然model中的每行對應於列表中的乙個string,因此,insertrows()函式在string list  中指定位置插入乙個空string,

父index通常用於決定model中行列的位置,本例中只有乙個單獨的頂級項,困此只需要在list中插入空string。

bool stringlistmodel::insertrows(int position, int rows, const qmodelindex &parent)

endinsertrows();

return true;

}begininsertrows()通知其他元件行數將會改變。endinsertrows()對操作進行確認與通知。

返回true表示成功。

刪除操作與插入操作類似:

bool stringlistmodel::removerows(int position, int rows, const qmodelindex &parent)

endremoverows();

return true;

}來自:http://www.cppblog.com/yuanyajie/archive/2007/06/18/26555.html

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