有時,咱們的系統須要顯示大量數據,好比從數據庫中讀取數據,以本身的方式顯示在本身的應用程序的界面中。早期的 Qt 要實現這個功能,須要定義一個組件,在這個組件中保存一個數據對象,好比一個列表。咱們對這個列表進行查找、插入等的操做,或者把修改的地方寫回,而後刷新組件進行顯示。這個思路很簡單,也很清晰,可是對於大型程序,這種設計就顯得蒼白無力。好比,在一個大型系統中,你的數據可能很大,所有存入一個組件的數據對象中,效率會很低,而且這樣的設計也很難在不一樣組件之間共享數據。若是你要幾個組件共享一個數據對象,要麼你就要用存取函數公開這個數據對象,要麼你就必須把這個數據對象放進不一樣的組件分別進行維護。數據庫
Smalltalk 語言發明了一種嶄新的實現,用來解決這個問題,這就是著名的 MVC 模型。對這個模型無需多言。MVC 是 Model-View-Controller 的簡寫,即模型-視圖-控制器。在 MVC 中,模型負責獲取須要顯示的數據,而且存儲這些數據的修改。每種數據類型都有它本身對應的模型,可是這些模型提供一個相同的 API,用於隱藏內部實現。視圖用於將模型數據顯示給用戶。對於數量很大的數據,或許只顯示一小部分,這樣就能很好的提升性能。控制器是模型和視圖之間的媒介,將用戶的動做解析成對數據的操做,好比查找數據或者修改數據,而後轉發給模型執行,最後再將模型中須要被顯示的數據直接轉發給視圖進行顯示。MVC 的核心思想是分層,不一樣的層應用不一樣的功能。數據結構
Qt 4 開始,引入了相似的 model/view 架構來處理數據和麪向最終用戶的顯示之間的關係。當 MVC 的 V 和 C 結合在一塊兒,咱們就獲得了 model/view 架構。這種架構依然將數據和界面分離,可是框架更爲簡單。一樣,這種架構也容許使用不一樣界面顯示同一數據,也可以在不改變數據的狀況下添加新的顯示界面。爲了處理用戶輸入,咱們還引入了委託(delegate)。引入委託的好處是,咱們可以自定義數據項的渲染和編輯。架構
如上圖所示,模型與數據源進行交互,爲框架中其它組件提供接口。這種交互的本質在於數據源的類型以及模型的實現方式。視圖從模型獲取模型索引,這種索引就是數據項的引用。經過將這個模型索引反向傳給模型,視圖又能夠從數據源獲取數據。在標準視圖中,委託渲染數據項;在須要編輯數據時,委託使用直接模型索引直接與模型進行交互。框架
總的來講,model/view 架構將傳統的 MV 模型分爲三部分:模型、視圖和委託。每個組件都由一個抽象類定義,這個抽象類提供了基本的公共接口以及一些默認實現。模型、視圖和委託則使用信號槽進行交互:編輯器
全部的模型都是QAbstractItemModel
的子類。這個類定義了供視圖和委託訪問數據的接口。模型並不存儲數據自己。這意味着,你能夠將數據存儲在一個數據結構中、另外的類中、文件中、數據庫中,或者其餘你所能想到的東西中。咱們將在後面再詳細討論這些內容。函數
QAbstractItemModel
提供的接口足夠靈活,足以應付以表格、列表和樹的形式顯示的數據。可是,若是你須要爲列表或者表格設計另外的模型,直接繼承QAbstractListModel
和QAbstractTableModel
類可能更好一些,由於這兩個類已經實現了不少通用函數。關於這部份內容,咱們也會在後文中詳述。性能
Qt 內置了許多標準模型:設計
QStringListModel
:存儲簡單的字符串列表。QStandardItemModel
:能夠用於樹結構的存儲,提供了層次數據。QFileSystemModel
:本地系統的文件和目錄信息。QSqlQueryModel
、QSqlTableModel
和QSqlRelationalTableModel
:存取數據庫數據。正如上面所說,若是這些標準模型不能知足你的須要,就必須繼承QAbstractItemModel
、QAbstractListModel
或者QAbstractTableModel
,建立本身的模型類。code
Qt 還提供了一系列預約義好的視圖:QListView
用於顯示列表,QTableView
用於顯示錶格,QTreeView
用於顯示層次數據。這些類都是QAbstractItemView
的子類。這意味着,若是你要建立新的視圖類,則能夠繼承QAbstractItemView
。
QAbstractItemDelegate
則是全部委託的抽象基類。自 Qt 4.4 依賴,默認的委託實現是QStyledItemDelegate
。可是,QStyledItemDelegate
和QItemDelegate
均可以做爲視圖的編輯器,兩者的區別在於,QStyledItemDelegate
使用當前樣式進行繪製。在實現自定義委託時,推薦使用QStyledItemDelegate
做爲基類,或者結合 Qt style sheets。對象
若是你以爲 model/view 模型過於複雜,或者有不少功能是用不到的,Qt 還有一系列方便使用的類。這些類都是繼承自標準的視圖類,而且繼承了標準模型。這些類並非爲其餘類繼承而準備的,只是爲了使用方便。它們包括QListWidget
、QTreeWidget
和QTableWidget
。這些類遠不如視圖類靈活,不能使用另外的模型,所以只適用於簡單的情形。