我正在开发一个映射应用程序,需要使用表格、表单和地图中的图形对象来显示数据对象。我正在使用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的双模型/视图框架之间的差距,他们是如何做到的?
如果我只需要表格和表单视图,那么这很容易,我只需使用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的双模型/视图框架之间的差距,他们是如何做到的?
QGraphicsItem
传递到场景中的需求?您是否建议将QAbstractItemView
包装在QGraphicsItem
中,以便可以呈现它? - heltonbiker