Smalltalk語言發明了一種嶄新的實現,用來解決 這個問題,這就是著名的MVC模型。
對這個模型無需多言,簡單來說,這是一個model-view-controller模型,即模型-視圖-控
制器。在 MVC中,模型負責獲取需要顯示的數據,并且能夠存儲這些數據的修改。每種數據
類型都有它自己對應的模型,但是這些模型提供一個相同的API,用于隱藏內 部實現。視圖
用于將模型數據顯示給用戶。對于很大的數據,或許只顯示一小部分,這樣就能很好的提高
性能??刂破魇悄P秃鸵晥D之間的媒介,將用戶的動作解析 成對數據的操作,比如查找數據
或者修改數據,然后轉發給模型執行,最后再將模型中需要被顯示的數據直接轉發給視圖進
行顯示。
對于Qt而 言,它使用的是一個類似于MVC模型的model-view架構。其中,model就相
當于MVC 架構中的model,而對于控制器部分,Qt 使用的是另外的一種抽象,代理
delegate。代理被用來提供對item渲染和編輯的控制。對于每種視 圖,Qt都提供了一個默認
的代理,對于大多數應用來說,我們只需要使用這個默認的代理即可。這其中的類關系如下
圖所示(出自C++ GUI Programming with Qt 4, 2nd Edition)

使用Qt的 model-view架構,我們可以讓model是取回view所要展示的數據,這樣就
可以在不降低性能的情形下處理大量數據。并且你可以把一個 model注冊給多個view,讓這
些view能夠顯示同樣的數據,也就是為同一個數據提供不同的顯示方式。Qt會自動地對這些
view保持同步,自動刷 新所有的view以顯示最新的數據。這樣,我們就可以只對model進
行修改,view會自動更新。
在少量數據的情形下,我們不需要動 用model這樣重量級的組件。Qt為了方便起見也提
供了item view類,分別是QListWidget,QTableWidget和QTreeWidget,使用這些類可以
直接對item 進行操作。這種實現很像 Qt 早期版本,組件中包含了相應的item,例如
QTableWidget中包含有QTableWidgetItem等。但是對于很大的數據,我們則需要 使用Qt的
view類,比如QListView,QTabelView和QTreeView,同時需要提供一個model,可以是自
定義model,也可 以是Qt 預置的model。例如,如果數據來自數據庫,那么你可以使用
QTabelView和QSqlTableModel這兩個類。