如何使用Qt Model/View框架与Graphics View框架?

18
我正在开发一个映射应用程序,需要使用表格、表单和地图中的图形对象来显示数据对象。我正在使用PyQt,但这不是重点,因为这是一个Qt问题,而不是Python问题。
如果我只需要表格和表单视图,那么这很容易,我只需使用Qt Model/View框架即可。然而,我需要地图视图提供仅在Graphics View框架中才能使用的功能,它本质上是自己的Model/View框架,其中QGraphicsScene充当数据模型。
我可以想到两种方法来解决这个问题。一种方法是从QAbstractItemModel进行子类化开始,将其与QAbstractItemView的子类链接起来,然后在场景中生成和更新QGraphicsItems。但这看起来很丑陋,因为我不确定如何通过与QGraphicsItems的交互处理用户对数据项的交互和更改。
我能想到的另一种方法是将QGraphicsScene视为权威数据源,将数据对象存储在每个QGraphicsItem的.data()属性中。然后,我会对QAbstractItemModel进行子类化,并编写它以便访问场景中的数据作为其数据存储,其他视图将使用此作为其模型。但是,如何将场景中的数据更改传播到模型呢?
无论采取哪种方法,都似乎存在框架无法处理的差距。在Model/View中,所有更改都假定在模型中进行。在Graphics View中,所有更改都假定在场景中进行。
所以你会选择哪种方法:QAbstractItemModel(权威)->QAbstractItemView->QGraphicsScene,还是QGraphicsScene(权威)->QAbstractItemModel->其他视图?为什么选择其中一种,你预见到了哪些陷阱?是否有其他人需要弥合Qt的双模型/视图框架之间的差距,他们是如何做到的?
1个回答

16

QAbstractItemModel(权威)-> QAbstractItemView -> QGraphicsScene

毫无疑问。我以前做过这个,需要有一些重复的内容(至少我无法避免),但都不是太困难。

这也允许您在场景中使用标准视图来表示数据,非常好用。

我的最佳建议是,在您创建的 QAbstractItemView 中存储一个 QHash ,将 QPersistantModelIndex 映射到 QGraphicsItem 和一个 QGraphicsScene。这样,您可以快速地在模型/视图空间(QModelIndex)和图形视图空间(QGraphicsItem)之间切换。


@Simon:恭喜,希望QtQuick/QML等方面的发展将来会让这更加容易。 - Adam W
此外,Itemviews NG (http://labs.trolltech.com/blogs/category/itemviews) 如果能够走出实验室的话,也应该会在这个领域有所帮助。 - Casey
@SimonHibbs,你在这方面有任何进展吗?我正在创建一个地图查看器/编辑器,正面临着与你一样的挑战。你有任何可以分享的代码吗?你的最终应用程序是开源的吗? - heltonbiker
@AdamW,这种策略如何处理需要将QGraphicsItem传递到场景中的需求?您是否建议将QAbstractItemView包装在QGraphicsItem中,以便可以呈现它? - heltonbiker
3
@heltonbiker,我在近6年前回答了这个问题,许多事情可能已经发生了变化,并且我已经不再使用Qt。然而,如果我记得正确的话,你不想将QAbstractItemView包装到QGraphicsItem中,而是想基于QAbstractItemView创建QGraphicsItems,并从dataChanged()更新它们。 - Adam W
显示剩余2条评论

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