如何在Graphics View框架中使用Qt Model / View框架

时间:2010-07-06 17:19:04

标签: qt qt4 pyqt pyqt4 qgraphicsview

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

如果我只需要表格和表格视图,这很容易,我只使用Qt模型/视图框架。但是我需要map视图来提供只有使用Graphics View框架才真正可用的功能,它实际上是它自己的Model / View框架,QGraphicsScene充当数据模型。

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

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

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

那么您选择哪种方法QAbstractItemModel(权威) - > QAbstractItemView-> QGraphicsScene或QGraphicsScene(权威) - > QAbstractItemModel->其他视图。你为什么选择一个而不是另一个?你有什么期望?有没有其他人需要弥合Qt的双模型/视图框架之间的差距,你是怎么做到的?

1 个答案:

答案 0 :(得分:11)

  

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

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

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

我最好的建议是在您创建的QHash中存储QPersistantModelIndex QGraphicsItem QGraphicsSceneQAbstractItemViewQModelIndex。这使您可以快速进入模型/视图范围(QGraphicsItem)到图形视图范围({{3}})