鍍金池/ 教程/ C/ model-view 架構(gòu)
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲(chǔ)容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對(duì)話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對(duì)話框之 QColorDialog
QPainter(續(xù))
國(guó)際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對(duì)象
QSortFilterProxyModel
國(guó)際化(上)
組件布局
自定義 Model 之三
事件過(guò)濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對(duì)話框之 QFileDialog
自定義 model 之二
深入了解信號(hào)槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個(gè)對(duì)話框(下)
Qt 學(xué)習(xí)之路(32): 一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(Graphics View)
文本文件讀寫(xiě)
自定義事件
編寫(xiě)跨平臺(tái)的程序
MainWindow
初探信號(hào)槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對(duì)話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進(jìn)制文件讀寫(xiě)
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲(chǔ)容器
進(jìn)程間交互
API 文檔的使用
創(chuàng)建一個(gè)對(duì)話框(上)
一個(gè)簡(jiǎn)易畫(huà)板的實(shí)現(xiàn)(QWidget)

model-view 架構(gòu)

從這一節(jié)開(kāi)始,我們進(jìn)入 model-view 階段。這一階段主要還是依據(jù) C++ GUI Programming with Qt4, 2nd Edition。

我們的系統(tǒng)有很多數(shù)據(jù)顯示的需求,比如從數(shù)據(jù)庫(kù)中把數(shù)據(jù)取出,然后以自己的方式顯示在我們自己的應(yīng)用程序的界面中。進(jìn)行這一操作的典型方式是使用 Qt 的 Item View 類。

在早期的 Qt 版本中,要實(shí)現(xiàn)這個(gè)功能,我們需要定義一個(gè) widget,然后在這個(gè) widget 中保存一個(gè)數(shù)據(jù)對(duì)象,比如是個(gè) list,然后我們對(duì)這個(gè) list 進(jìn)行查找、插入等的操作,或者把修改的地方寫(xiě)回這個(gè) list,然后刷新 widget 進(jìn)行顯示。這個(gè)思路很簡(jiǎn)單,也很清晰,但是對(duì)于大型程序,這種設(shè)計(jì)就顯得蒼白無(wú)力。比如,在一個(gè)大型系統(tǒng)中,你的數(shù)據(jù)可能很大,如果全部存入一個(gè) widget 的數(shù)據(jù)對(duì)象中,效率會(huì)很低,并且這樣的設(shè)計(jì)也很難在 widgets 之間共享變量,也就是說(shuō),如果你要幾個(gè)組件共享一個(gè)數(shù)據(jù)對(duì)象,要么你就要用 getter 函數(shù)公開(kāi)這個(gè)數(shù)據(jù)對(duì)象,要么你就必須把這個(gè)數(shù)據(jù)對(duì)象放進(jìn)不同的組件分別進(jìn)行維護(hù)。

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)

http://wiki.jikexueyuan.com/project/learn-road-qt/images/66.png" alt="" />

使用 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 為了方便起見(jiàn)也提供了 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è)類。

今天就說(shuō)這些,下次我們將開(kāi)始進(jìn)入對(duì) model-view 架構(gòu)的具體介紹。

本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918