qt model/view 學習筆記
2010-06-28 12:42:03
閱讀38
字型大小:大中小
訂閱建立新的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;}
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 學習筆記 六
在views中選擇資料項 概念 qtableview table new qtableview 0 table setmodel model qitemselectionmodel selectionmodel table selectionmodel qmodelindex topleft qmo...