Qt学习笔记-----Model/View架构
為了實現數據的存儲和表現分離,Qt提供了Model/View架構,包括三個部分,分別是模型(Model),視圖(View),委托(delegate)。
Model用于訪問底層數據,也就是說為其他組件訪問存儲的數據提供了接口。
View通過Model Index來獲取底層的數據,將數據繪制到窗體上。
Delegate是在View需要編輯的時候提供一種自定義編輯方式。比如我們可能只允許輸入數字,那么就需要委托來做這件事情。
三個部分只有Model知道怎么從內存中讀取數據,而View和Delegate則是借助Model Index通過Model來訪問。
對于View來說,它不需要知道底層數據是如何存儲的(這是Model的任務),它只需要從Model那里要來數據,然后把數據放到屏幕上就可以了。
對于Model來說,它也不需要知道數據是怎么被表現在屏幕上的(那是View的任務),它只需要響應View的請求,從內存中找到數據然后告訴View就可以了。
對于Delegate來說,它什么都不需要知道,它只需要在某個組件需要編輯的時候,提供一個自定義的編譯器(如果有某種需求的話,比如只允許輸入數字),然后將編輯結果反饋給Model讓它來更改底層數據,反饋給View讓它更新屏幕顯示即可。
Models, Views, Delegates三者之間的相互作用是通過信號槽來實現的:
1.由Model發出的信號告訴View底層數據發生了改變。
2.由View發出的信號提供用戶與窗體中元素之間交互的信息,比如說鼠標點擊某個位置,需要編輯某個元素。
3.由Delegate發出的信號是在編輯某個元素時發出的,告訴Model和View編輯狀態,比如編輯完成。
Model Classes:
Model提供一個標準的接口供View和Delegate訪問數據,在Qt中,這個接口定義在QAbstractItemModel類中。
MV架構中使用模型索引(Model Index)來確保數據的表現和它被存儲的方式之間相互分離。View和Delegate就是通過模型索引來請求Model獲取數據。因此,只有Model知道如何通過Model Index獲取數據。
一個完整的model index包括行索引,列索引和它父元素的model index。
View Classes:
在MV架構中,View負責從Model那里獲取數據然后展現給用戶,數據被展現的方式是自定的,不需要考慮它在底層內存是如何存儲的。況且View也根本不清楚這件事情。
View主要用于對需要展現給用戶的數據進行布局,Qt也提供了一個標準視圖接口QAbstractItemView。
除了呈現給用戶數據,View也承擔著數據選擇相關的責任,以及菜單和拖放的任務。View也具有編輯功能,如果不需要對用戶的輸入進行控制,那么View自帶的編輯器就已經足夠了。否則就需要只用Delegate委托生成一個編輯器來對用戶輸入進行控制。
View使用setModel()來設置它的模型
Delegate Classes:
Delegate主要用于當View中的元素需要編輯時,提供自定義的編輯方式,實現對用戶輸入進行控制。比如說只允許輸入數字等。委托的接口定義在QAbstractItemDelegate中。
當View需要一個Delegate時,那么用戶就需要自定義一個子類繼承委托接口。但是需要提供一些函數:
createEditor()創建一個編輯器,可以是任何可編輯的組件。
setEditorData()提供編輯器的初始值,即雙擊編輯時初始顯示的內容,通常都是編輯前該位置的內容。
setModelData()當輸入完畢后更改底層數據,通過Model Index。將創建的組件中存儲的內容取出,再利用model->setData()函數修改數據。
updateEditorGeometry()用于改變編輯器的位置和大小,將它放在需要編輯的位置。
委托對于輸入的控制主要是利用createEditor中使用的組件,比如如果在該函數中使用QSpinBox,那這個編輯器可能就只允許輸入整數。如果使用QLineEdit,那么可以輸入任何內容。輸入完成之后,Delegate會發出信號告訴Model和View編輯完成,然后在setModelData函數中我們需要將創建的組件中存儲的信息取出,然后利用model->setData()函數來更新數據。當數據發生改變后,Model又發出信號告訴View,隨后View會自動更新顯示的內容(這是Qt自動完成的)。
總結
以上是生活随笔為你收集整理的Qt学习笔记-----Model/View架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记-----Graphics_
- 下一篇: Qt学习笔记-----Model/Vie