《Qt編程的藝術》——8.1model/view結構的底層概念

model/view結構基於一個概念——將數據與顯示分離。這樣做,一份數據可以容易地在不同窗口裏面展示,展示的形式可以通過list或者table。這樣,數據源理論上不關心view如何現實它,view也不在意數據源的內部解結構,在這兩者之間存在的東西就是——model。圖8.1展示了這種關係。
 
從圖中可以看出,model和view相互間是有聯繫的,model有一些基本屬性,view也會用到:在model裏,每個條目都佔據一行和一列,如果需要的話,還有一個指向父對象的連接(只對嵌套list有用)。Interview用QModelIndex類來描述這些基本屬性。
 
有了QModelIndex類的幫助,model能夠引用Index指向的數據,並將其按照view需要的格式提供給view。
 
爲了正確地在屏幕上顯示數據,view通過QModelIndex查詢數據源,查詢的方式按照不同的規定(roles)。在顯示規定(DisplayRole)中,view希望獲得要顯示的文本;在裝飾規定(DecorationRole)中,view希望獲得一個圖標;在字體規定(FontRole)中,則是要顯示文本的字體類型;在工具提示規定(ToolTipRole)中,則是顯示的工具提示的文本。預先定義的規定總共有十幾條,如表8.1所示。
model的data()方法負責傳遞數據,因此需要根據規定的類型的不同,執行相應的動作。這一過程,還需要model index的幫助。它向view返回QVariant類型的結果。view根據請求的規定類型來解析收到的數據。如果,考慮到有了規定(role)和model index,但沒有有效地數據可以返回,此時model會返回一個空的QVariant對象作爲data()調用的結果。通過這種流程,view能根據不同的規定(role)來展示不同的數據類型。圖8.2作爲一個示例,展示了在list view裏使用不同規定(role)的效果。
 
如果對預先定義的規定並不滿足,你可以定義自己的規定,並讓他們在 model裏可用。Qt預先定義的view,卻並不能使用他們。要使用你自定義的規定(role),又不想從預先定義的view繼承子類的話,還有一種簡單辦法。就是使用delegate,它負責繪製list或table中的條目。
 
Qt提供的delegate在QItemDelegate類中實現,在大多數情況下都是夠用的。它也提供了一個編輯函數來修改view中顯示的元素。對於這一點是有用的,但是model必須支持寫回到數據源,情況並非總是如此:許多model僅僅能讀取數據,並不提供寫入功能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章