W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
從這一節(jié)開始,我們進入 model-view 階段。這一階段主要還是依據(jù) C++ GUI Programming with Qt4, 2nd Edition。
我們的系統(tǒng)有很多數(shù)據(jù)顯示的需求,比如從數(shù)據(jù)庫中把數(shù)據(jù)取出,然后以自己的方式顯示在我們自己的應(yīng)用程序的界面中。進行這一操作的典型方式是使用 Qt 的 Item View 類。
在早期的 Qt 版本中,要實現(xiàn)這個功能,我們需要定義一個 widget,然后在這個 widget 中保存一個數(shù)據(jù)對象,比如是個 list,然后我們對這個 list 進行查找、插入等的操作,或者把修改的地方寫回這個 list,然后刷新 widget 進行顯示。這個思路很簡單,也很清晰,但是對于大型程序,這種設(shè)計就顯得蒼白無力。比如,在一個大型系統(tǒng)中,你的數(shù)據(jù)可能很大,如果全部存入一個 widget 的數(shù)據(jù)對象中,效率會很低,并且這樣的設(shè)計也很難在 widgets 之間共享變量,也就是說,如果你要幾個組件共享一個數(shù)據(jù)對象,要么你就要用 getter 函數(shù)公開這個數(shù)據(jù)對象,要么你就必須把這個數(shù)據(jù)對象放進不同的組件分別進行維護。
Smalltalk 語言發(fā)明了一種嶄新的實現(xiàn),用來解決這個問題,這就是著名的 MVC 模型。對這個模型無需多言,簡單來說,這是一個 model-view-controller 模型,即模型-視圖-控制器。在 MVC 中,模型負責(zé)獲取需要顯示的數(shù)據(jù),并且能夠存儲這些數(shù)據(jù)的修改。每種數(shù)據(jù)類型都有它自己對應(yīng)的模型,但是這些模型提供一個相同的 API,用于隱藏內(nèi)部實現(xiàn)。視圖用于將模型數(shù)據(jù)顯示給用戶。對于很大的數(shù)據(jù),或許只顯示一小部分,這樣就能很好的提高性能??刂破魇悄P秃鸵晥D之間的媒介,將用戶的動作解析成對數(shù)據(jù)的操作,比如查找數(shù)據(jù)或者修改數(shù)據(jù),然后轉(zhuǎn)發(fā)給模型執(zhí)行,最后再將模型中需要被顯示的數(shù)據(jù)直接轉(zhuǎn)發(fā)給視圖進行顯示。
對于 Qt 而言,它使用的是一個類似于 MVC 模型的 model-view 架構(gòu)。其中,model 就相當(dāng)于 MVC架構(gòu)中的 model,而對于控制器部分,Qt 使用的是另外的一種抽象,代理 delegate。代理被用來提供對 item 渲染和編輯的控制。對于每種視圖,Qt 都提供了一個默認的代理,對于大多數(shù)應(yīng)用來說,我們只需要使用這個默認的代理即可。這其中的類關(guān)系如下圖所示(出自 C++ GUI Programming with Qt 4, 2nd Edition)
使用 Qt 的 model-view 架構(gòu),我們可以讓 model 是取回 view 所要展示的數(shù)據(jù),這樣就可以在不降低性能的情形下處理大量數(shù)據(jù)。并且你可以把一個 model 注冊給多個 view,讓這些 view 能夠顯示同樣的數(shù)據(jù),也就是為同一個數(shù)據(jù)提供不同的顯示方式。Qt 會自動地對這些 view 保持同步,自動刷新所有的 view 以顯示最新的數(shù)據(jù)。這樣,我們就可以只對 model 進行修改,view 會自動更新。
在少量數(shù)據(jù)的情形下,我們不需要動用 model 這樣重量級的組件。Qt 為了方便起見也提供了 item view 類,分別是 QListWidget,QTableWidget 和 QTreeWidget,使用這些類可以直接對 item 進行操作。這種實現(xiàn)很像 Qt 早期版本,組件中包含了相應(yīng)的 item,例如 QTableWidget 中包含有QTableWidgetItem 等。但是對于很大的數(shù)據(jù),我們則需要使用 Qt 的 view 類,比如 QListView,QTabelView 和 QTreeView,同時需要提供一個 model,可以是自定義 model,也可以是 Qt 預(yù)置的model。例如,如果數(shù)據(jù)來自數(shù)據(jù)庫,那么你可以使用 QTabelView 和 QSqlTableModel 這兩個類。
今天就說這些,下次我們將開始進入對 model-view 架構(gòu)的具體介紹。
本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: