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

12

我大概了解MPV的工作原理,但我不明白以下类:

  • QAbstractItemModel
  • QAbstractItemView
  • QAbstractItemDelegate/ QItemDelegate

可以为我做什么吗?

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

1个回答

13

抽象项模型 QAbstractItemView QAbstractItemDelegate

这些类来自于 “模型/视图框架”
这是一个非常强大的数据部分应用程序框架,这里 是关于该框架的演示。

QAbstractItemModel

是MVC中模型的基类。提供了访问和更改数据的全局接口,并处理可观察部分。

QAbstractItemView

是MVC中视图的基类。提供了视图/选择部分的全局接口,并处理观察者部分。您不必担心观察者模式,框架为您处理。

QAbstractItemDelegate

是MVC中控制器的基类。它对于绘制、编辑元素等是策略模式。


QGraphicsScene / QGraphicsView

这些类来自于 “图形视图框架”,并且独立于模型/视图框架
这也是一个非常强大的图形部分应用程序框架。

场景

QGraphicsScene提供了图形视图场景。场景具有以下职责:

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

视图

QGraphicsView提供了视图小部件,可视化内容。

若要在 QGraphicsView 中显示模型,您需要基于 QAbstractItemView 编写自己的视图。
将 QGraphicsView 作为视口小部件 QAbstractScrollArea::setViewport(QWidget * widget)),然后您可以:

  • 添加 QAbstractItemView::rowsInserted
  • 删除 QAbstractItemView::rowsAboutToBeRemoved
  • 更改 QAbstractItemView::dataChanged

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


3
QAbstractItemModel 提供了一个门面,用于将模型适配为视图所需的接口,它并不一定代表模型本身。 - Cătălin Pitiș
具体模型可以是真实模型(QStandardItemModel)、代理(QSortFilterProxyModel)或者是门面(QSqlTableModel)。 - TimW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接