2010-07-06 119 views
14

我正在研究一个地图绘制应用程序,并需要在地图中使用表格,表单和图形对象来显示数据对象。我使用的是PyQt,但这并不重要,因为这是一个Qt问题,而不是Python问题。如何在Graphics View框架中使用Qt Model/View框架

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

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

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

无论采取哪种方法,它看起来都有一个没有被框架处理的差距。在模型/视图中,假定所有更改均在模型中进行。在图形视图中,假定所有更改都是在场景中进行的。

那么你会选择QAbstractItemModel(权威) - > QAbstractItemView-> QGraphicsScene或者QGraphicsScene(权威) - > QAbstractItemModel->其他视图。为什么你会选择另一个,你会发现什么问题?有没有其他人需要弥补Qt的双模型/视图框架之间的差距,你是如何做到的?

回答

10

化QAbstractItemModel(权威) - > QAbstractItemView-> QGraphicsScene

毫无疑问。我之前做过这件事,它确实需要一点重复(至少有些我是无法避免的),但没有什么不好。

这也可以让您在标准视图中表示您的数据以及相当不错的场景。

我最好的建议是要存储QPersistantModelIndex一个QHashQGraphicsItem,并创建一个QAbstractItemViewQGraphicsScene。这允许您快速地在模型/视图地块(QModelIndex)与Graphics View地块之间(QGraphicsItem

+0

这是我开始使用的方法,然后才意识到我可以以其他方式做到这一点。我猜AQbstractItemView的唯一方法,我需要子类dataChanged(),rowsInserted()和rowsAboutToBeRemoved()?然后适当管理场景中的项目。我希望我将QPersistentModelIndexes存储在QGraphicsItems中。 我喜欢QHash的想法。我使用的是PyQT,因此我会使用Python字典,但是这是一种很好的优化方式。 – 2010-07-07 05:48:44

+0

@Simon:是的,我认为你已经知道了,在dataChanged()中,你可能需要从QGraphicsScene中复制一些代码,这取决于你的数据和表示,但是,如果有的话,它应该是次要的。 – 2010-07-07 10:44:09

+0

在基础水平上得到它的工作。好极了! – 2010-07-07 15:16:17