Qt 5模型/檢視結構

羅三炮炮發表於2020-11-28

Qt引入了模型/檢視結構用於完成資料與介面的分離,即InterView框架。Qt的InterView框架把檢視和控制器部件結合在一起,是的框架更為簡潔。為了靈活地處理輸入,InterView框架引入了代理(Delegate)。通過使用代理,能夠自定義資料條目(Item)的顯示與編輯。
Qt的模型/檢視結構分為三部分:模型(Model)、檢視(View)和代理(Delegate)。其中,

  • 模型與資料來源通訊,併為其他部件提供介面;
  • 檢視從模型中獲得用來引用資料條目的模型索引(Model Index)。
  • 在檢視中,代理負責繪製資料條目,當編輯條目時,代理和模型直接進行通訊。

模型/檢視/代理之間通過訊號和槽進行通訊,如圖所示。
在這裡插入圖片描述

  • 資料發生改變時,模型發出訊號通知檢視。
  • 使用者對介面進行操作,檢視發出訊號。
  • 代理髮出訊號告知模型和檢視編輯器目前的狀態。

1.模型(Model)

InterView框架中的所有模型都基於抽象基類QAbstractItemModel,此類由QProxyModel、QAbstractListModel、QAbstractTableModel、QAbstractProxyModel、QDirModel、QFileSystemModel、QHelpContentModel和QStandardItemModel類繼承。其中,QAbstractListModel類和QAbstract TableModel類是列表和表格模型的抽象基類,如果需要實現列表或表格模型,則應從這兩個類繼承。完成QStringList儲存的QStringListModel類繼承自QAbstractListModel類,而與資料庫有關的QSqlQueryModel類繼承自QAbstractTableModel類;QAbstractProxyModel類是代理模型的抽象類;QDirModel類是檔案和目錄的儲存模型。

2.檢視(View)

InterView框架中的所有檢視都基於抽象基類QAbstractItemView,此類由QColumnView、QHeaderView、QListView、QTableView和QTreeView類繼承。其中,QListView類由QUndoView類和QListWidget類繼承;QTableView類由QTableWidget類繼承;QTreeView類由QTreeWidget類繼承。而QListWidget類、QTableWidget類和QTreeWidget類實際上已經包含了資料,是模型/檢視整合在一起的類。

3.代理(Delegate)

InterView框架中的所有代理都基於抽象基類QAbstractItemDelegate,此類由QItemDelegate和 QStyledItemDelegate類繼承。其中,QItemDelegate類由表示資料庫中關係代理的QSqlRelationalDelegate類繼承。

相關文章