Qt之模型-視圖編程(模型-視圖編程概覽)

簡述

我們時常需要將存儲在計算機中的數據以可視化的方式展現出來。展現方法多種多樣。

可能是表格

可能是樹狀圖
也可能是列表

具體選用那種方法,需要根據數據的特徵來確定。

Qt提供的模型/視圖框架就是用來處理結構化數據的獲取與展示的。

模型/視圖架構

模型視圖控制器(MVC)是一種源自Smalltalk的設計模式,通常在構建用戶界面時使用。在《Design Patterns》中,Gamma etal. 說:

MVC由三種對象組成。模型是應用程序對象,視圖是其屏幕顯示,控制器定義了用戶界面對用戶輸入的反應方式。在MVC之前,用戶界面設計傾向於將這些對象放在一起。 MVC使它們解耦以增加靈活性和重用性。

如果將視圖和控制器對象組合在一起,則結果是模型/視圖架構。這仍然保持着數據的獲取與數據的表示相分離。這種分離使得可以在幾個不同的視圖中顯示相同的數據,並實現新的視圖類型,而無需更改基礎數據結構。爲了允許靈活地處理用戶輸入,我們引入了代理的概念。在此框架中使用代理的好處在於,它允許自定義呈現和編輯數據項的方式。



該模型與數據源通信,爲架構中的其他組件提供接口。
通信的性質取決於數據源的類型以及模型的實現方式。
視圖從模型中獲取模型索引;
這些是對數據項的引用。
通過爲模型提供模型索引,視圖可以從數據源檢索數據項。
在標準視圖中,代理呈現數據項。
編輯項目後,代理將直接使用模型索引與模型進行通信。

總的來說,模型/視圖框架中的類可以被分爲三組:模型類,視圖類以及代理類。這些組件中的每一個都由抽象類定義,這些抽象類提供了公共接口,並在某些情況下提供了功能的默認實現。抽象類旨在被子類化,以提供其他組件期望的全部功能。

模型,視圖和代理使用信號槽相互通信:

  • 來自模型的信號通知視圖數據源的數據發生了哪些變化。
  • 來自視圖的信號提供了用戶與被展示的項目之間的交互信息。
  • 來自代理的信號在會將編輯器的狀態通知模型與視圖。

提示: 上面的內容強調了三個核心概念:模型、視圖、代理。請牢記這三個概念,後面所有的內容都將圍繞它們展開。

模型

所有的模型都是基於QAbstractItemModel。這個類定義了一個接口供視圖和代理獲取數據。數據自身不需要存儲在模型中;它可能放在一個由獨立的類提供的結構,一個文件,一個數據庫,或者其它應用組件。

QAbstractItemModel提供了一個數據接口,該接口足夠靈活,可以處理以表,列表和樹的形式表示數據的視圖。但是,當爲列表和類似表的數據結構實現新模型時,QAbstractListModel和QAbstractTableModel類是更好的選擇,因爲它們提供了相關常用功能的默認實現。

Qt提供了一些現成的模型,可用於處理數據項:

  • QStringListModel 被用來存儲簡單的字符串項目列表。
  • QStandardItemModel 管理着更加複雜的樹形結構,樹形結構中的每一個成員可能包含着任意的數據。
  • QFileSystemModel提供有關本地系統中文件和目錄的信息。
  • QSqlQueryModel,QSqlTableModel和QSqlRelationalTableModel用於使用模型/視圖訪問數據庫。

如果這些標準的模型無法滿足你的需要,你可以通過子類化QAbstractItemModel,QAbstractListModel或QAbstractTableModel來創建自定義模型。

視圖

QListView用於展示列表類數據,QTableView將來自模型的數據展示在表格中,QTreeView在層次化列表中展示了模型中的數據項目。上面的類提供了針對各種視圖的完整實現。這些類都是QAbstractItemView的子類。儘管這些類是現成可用的,但他們也可以被子類化以提供自定義視圖。

代理

QAbstractItemDelegate是模型視圖架構中代理類的抽象基類。默認的代理實現是QStyledItemDelegate,並且它也被Qt的標準視圖用作默認代理。除了QStyledItemDelegate之外,QItemDelegate也可以用作默認代理。它們之間的區別在於QStyledItemDelegate使用當前樣式來繪製其項目。因此,在實現自定義委託或使用Qt樣式表時,建議將QStyledItemDelegate用作基類。

方便的類

從標準視圖類派生出許多便利類,它們更便於使用,但缺乏靈活性。

此類的示例包括QListWidget,QTreeWidget和QTableWidget。

這些類的靈活性不如視圖類,並且不能與任意模型一起使用。除非你非常想使用這些方便的類,否則儘量採用標準的模型/視圖框架。

如果希望在仍然使用基於項目的界面的同時利用模型/視圖方法提供的功能,請考慮將視圖類(例如QListView,QTableView和QTreeView)與QStandardItemModel一起使用。

總結

上面的內容中,我們首先介紹了Qt模型/視圖架構的作用以及由來,接着給出了三個核心概念:模型、視圖、代理,並逐一進行了粗略的介紹。應當牢牢地記住模型/視圖架構是由這三個組件構成的。

引用

[1] Qt助手

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章