Qt 中的模型 - 视图 - 控制器

Posted

技术标签:

【中文标题】Qt 中的模型 - 视图 - 控制器【英文标题】:Model - View - Controller in Qt 【发布时间】:2009-06-17 01:44:23 【问题描述】:

我或多或少了解 MPV 的工作原理。 但我不知道什么类:

QAbstractItemModel QAbstractItemView QAbstractItemDelegate / QItemDelegate

可以帮我吗?

如果这是相关的,我正在使用 QGraphicsScene / QGraphicsView 带有一些用户可以与之交互的元素(游戏板的视觉表示),而交互逻辑(游戏规则)被封装在其他类中。

【问题讨论】:

【参考方案1】:

AbstractItemModel QAbstractItemView QAbstractItemDelegate

来自"Mode/View framework" 这是一个非常强大的框架,用于您的应用程序的数据部分,here 是该框架的介绍。

QAbstractItemModel

MVC 模型 的基类。具有用于访问和更改数据的全局接口,并负责 Observable 部分。

QAbstractItemView

MVC 视图 的基类。具有视图/选择部分的全局接口,它负责观察者部分。您不必担心观察者模式,框架会为您完成。

QAbstractItemDelegate

MVC 的控制器 的基类。 是用于绘画、编辑元素的策略模式,...


QGraphicsScene / QGraphicsView

来自"The Graphics View Framework",并且独立于模型/视图框架。 这也是一个非常强大的图形部分框架。

场景

QGraphicsScene 提供了 Graphics 查看场景。现场有 以下职责:

提供快速接口 管理大量项目 将事件传播到每个项目 管理项目状态,例如选择 和焦点处理提供 未转换的渲染功能; 主要用于打印

观点

QGraphicsView 提供视图 小部件,可视化内容 的一个场景。你可以附上几个 对同一场景的看法,以提供 同一数据的多个视口 设置


如果您希望模型在 QGraphicsView 中可见,则必须基于 QAbstractItemView 编写自己的视图。 取一个 QGraphicsView 作为视口小部件QAbstractScrollArea::setViewport(QWidget * widget)) 然后就可以了

添加 QAbstractItemView::rowsInserted, 删除 QAbstractItemView::rowsAboutToBeRemoved改变 QAbstractItemView::dataChanged

场景中的项目。不要忘记处理重置布局更改事件。

【讨论】:

QAbstractItemModel 实际上提供了一个外观,用于使模型适应视图所需的界面,并且不必代表模型本身。 具体模型可以是真实模型(QStandarditemModel)、代理(QSortFilterProxyModel)也可以是门面(QSqlTableModel)

以上是关于Qt 中的模型 - 视图 - 控制器的主要内容,如果未能解决你的问题,请参考以下文章

MFC 中的文档/视图架构基本上是模型/视图/控制器模式但没有控制器吗?

QT 模型/视图 编程 委托篇

OPENCV学习笔记3-4_使用模型-视图-控制器设计应用程序

包含模型数据的容器视图中的页面视图控制器

在 Qt 中,如何正确实现委托?

使用 rxSwift 中的 tableView 单元将数据从视图模型传递到视图控制器