Qt學習之路 38 model view架構

2021-09-30 04:11:38 字數 1678 閱讀 7284

從這一節開始,我們進入model-view階段。這一階段主要還是依據 c++ gui programming with qt4, 2nd edition。

我們的系統有很多資料顯示的需求,比如從資料庫中把資料取出,然後以自己的方式顯示在我們自己的應用程式的介面中。進行這一操作的典型方式是使用qt的item view類。

在早期的qt版本中,要實現這個功能,我們需要定義乙個widget,然後在這個widget中儲存乙個資料物件,比如是個list,然後我們對這個list進行查詢、插入等的操作,或者把修改的地方寫回這個list,然後重新整理widget進行顯示。這個思路很簡單,也很清晰,但是對於大型程式,這種設計就顯得蒼白無力。比如,在乙個大型系統中,你的資料可能很大,如果全部存入乙個widget的資料物件中,效率會很低,並且這樣的設計也很難在widgets之間共享變數,也就是說,如果你要幾個元件共享乙個資料物件,要麼你就要用getter函式公開這個資料物件,要麼你就必須把這個資料物件放進不同的元件分別進行維護。

smalltalk語言發明了一種嶄新的實現,用來解決這個問題,這就是著名的mvc模型。對這個模型無需多言,簡單來說,這是乙個model-view-controller模型,即模型-檢視-控制器。在mvc中,模型負責獲取需要顯示的資料,並且能夠儲存這些資料的修改。每種資料型別都有它自己對應的模型,但是這些模型提供乙個相同的api,用於隱藏內部實現。檢視用於將模型資料顯示給使用者。對於很大的資料,或許只顯示一小部分,這樣就能很好的提高效能。控制器是模型和檢視之間的媒介,將使用者的動作解析成對資料的操作,比如查詢資料或者修改資料,然後**給模型執行,最後再將模型中需要被顯示的資料直接**給檢視進行顯示。

對於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這兩個類。

今天就說這些,下次我們將開始進入對model-view架構的具體介紹。

Qt學習之路

qt 學習之路 是在網路上受到一定歡迎的 qt 入門教程。只是這個系列便攜與 2009 年,至今已經有三年多的時間。今天的 qt 有了很大的變化,包括 qt quick 的加入 qt 底層架構的改變,更重要的是 qt 5 的發布。本系列文章將會是 qt 學習之路 的一次公升級和修訂,著重關注於 qt...

QT學習之路

qt學習之路2 目錄 1 序2 qt 前言 3 hello,world 4 訊號槽 5 自定義訊號槽 6 qt 模組簡介 7 mainwindow 簡介 8 新增動作 9 資源檔案 10 物件模型 11 布局管理器 12 選單欄 工具欄和狀態列 13 對話方塊簡介 14 對話方塊資料傳遞 15 標準...

Qt學習之路

多年前聽說過qt的大名,但所有的探索都是淺嘗輒止並未深入了解,2020年6月,一直困擾域mfc框架的繁瑣和對windows平台的限制,下定決心學習qt,替代一直使用的mfc框架進行開發。本系列的內容是以工程實踐為主,記錄 總結我在工作過程中使用qt時的內容,目標是盡快熟練的使用qt,文章內容更多的傾...