18

我正在开发一个地图应用程序,需要使用表格、表单和地图中的图形对象来显示数据对象。我正在使用 PyQt,但这并不重要,因为这是一个 Qt 问题而不是 Python 问题。

如果我只需要表格和表单视图,这很容易,我只需使用 Qt 模型/视图框架。但是,我需要地图视图提供仅使用 Graphics View 框架才真正可用的功能,该框架本质上是它自己的模型/视图框架,QGraphicsScene 充当数据模型。

我可以想到两种方法来做到这一点。一种方法是从 QAbstractItemModel 子类的权威模型开始,将其链接到 QAbstractItemView 的子类,然后从那里生成和更新场景中的 QGraphicsItems。这看起来很难看,因为我不确定如何通过与 QGraphicsItems 的交互来处理用户与数据项的交互和对数据项的更改。

我能想到的另一种方法是将 QGraphicsScene 视为权威数据源,将数据对象存储在每个 QGraphicsItem 的 .data() 属性中。然后我将 QAbstractItemModel 子类化并编写它,以便它访问场景中的数据,因为它是数据存储,然后其他视图将使用它作为他们的模型。我如何将场景中数据的更改传播到模型?

无论我采用哪种方法,框架似乎都没有处理差距。在模型/视图中,假设所有更改都在模型中进行。在图形视图中,假定所有更改都在场景中进行。

那么您会选择哪种方法 QAbstractItemModel(authoritative)->QAbstractItemView->QGraphicsScene 或 QGraphicsScene(authoritative)->QAbstractItemModel->Other Views。你为什么会选择其中一个,你预计会有什么问题?还有其他人需要弥合 Qt 的双模型/视图框架之间的差距吗?你是怎么做到的?

4

1 回答 1

15

QAbstractItemModel(权威)->QAbstractItemView->QGraphicsScene

毫无疑问。我以前做过这个,它确实需要一些重复(至少有些是我无法避免的),但没什么太糟糕的。

这也允许您在标准视图中表示您的数据以及非常好的场景。

我最好的建议是将 a QHashof QPersistantModelIndextoQGraphicsItem和 a存储QGraphicsSceneQAbstractItemView您创建的内容中。这使您可以在模型/视图区域 ( QModelIndex) 和图形视图区域 ( QGraphicsItem)之间快速切换

于 2010-07-06T20:29:31.817 回答