Smalltalk語(yǔ)言發(fā)明了一種嶄新的實(shí)現(xiàn),用來(lái)解決 這個(gè)問(wèn)題,這就是著名的MVC模型。
對(duì)這個(gè)模型無(wú)需多言,簡(jiǎn)單來(lái)說(shuō),這是一個(gè)model-view-controller模型,即模型-視圖-控
制器。在 MVC中,模型負(fù)責(zé)獲取需要顯示的數(shù)據(jù),并且能夠存儲(chǔ)這些數(shù)據(jù)的修改。每種數(shù)據(jù)
類型都有它自己對(duì)應(yīng)的模型,但是這些模型提供一個(gè)相同的API,用于隱藏內(nèi) 部實(shí)現(xiàn)。視圖
用于將模型數(shù)據(jù)顯示給用戶。對(duì)于很大的數(shù)據(jù),或許只顯示一小部分,這樣就能很好的提高
性能。控制器是模型和視圖之間的媒介,將用戶的動(dòng)作解析 成對(duì)數(shù)據(jù)的操作,比如查找數(shù)據(jù)
或者修改數(shù)據(jù),然后轉(zhuǎn)發(fā)給模型執(zhí)行,最后再將模型中需要被顯示的數(shù)據(jù)直接轉(zhuǎn)發(fā)給視圖進(jìn)
行顯示。
對(duì)于Qt而 言,它使用的是一個(gè)類似于MVC模型的model-view架構(gòu)。其中,model就相
當(dāng)于MVC 架構(gòu)中的model,而對(duì)于控制器部分,Qt 使用的是另外的一種抽象,代理
delegate。代理被用來(lái)提供對(duì)item渲染和編輯的控制。對(duì)于每種視 圖,Qt都提供了一個(gè)默認(rèn)
的代理,對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō),我們只需要使用這個(gè)默認(rèn)的代理即可。這其中的類關(guān)系如下
圖所示(出自C++ GUI Programming with Qt 4, 2nd Edition)

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