使用Qt模型/视图框架在用户编辑的另一视图中制成的图来通知的QGraphicsItem(Using

2019-10-31 10:14发布

我想设计一个多视图的应用程序使用Qt的模型/视图框架,这样我可以将很多复杂的逻辑了我的QGraphicsItem类。

如在下面的图中所示,该应用程序由两个(或更多)观看相同的一系列红色垂直辅助线的每个包含A1B1C1 ...在沿着每个视图相同的水平位置。

我想,以确保当用户拖动的引导线一个视图,说从点A1A_1'如上面的图中,在其它视图所有相应的引导线移动通过相同的距离,并在相同的方向,例如从A2A2' 。 此外,它不应该是可能的拖动一个引导线穿过另一个即引导线必须保持其相对的订单。 这是我想搬出我的指导课,到模型的逻辑的一部分。

我知道拖动引导线触发的QGraphicsItem :: itemChange,如下图所示的片段。 我不知道是如何最好地

  1. 候选值转发给模型验证(和存储)。 我知道该视图界面中的“通过信号和槽的机制与模式进行互操作的标准接口。” 最大的问题,在我看来,是QGraphicsItem::itemChange必须立即返回验证值不能依靠异步信号插槽机制。
  2. 通知在变更的其它视图的引导线,而不会触发创建通知的级联,例如其中A1B1无休止地通知对方。

-

class GuideLine( QtGui.QGraphicsLineItem ):
    ...
    # Called when item is about to change to value
    def itemChange( self , change , value ):
        # TODO 
        #  1. validate value in model
        #  2. if change is valid notify peers in other views
        pass

Answer 1:

QGraphicsScene和的QGraphicsView可以被看作是一个模型/视图实现,其中的场景将是模型和的QGraphicsView会的看法。

两个的QGraphicsView可以共享同一个场景,当你从一个视图修改场景,第二个也将被更新。

一个简单的例子:

if __name__ == "__main__":

    app = QApplication([])
    scene = QGraphicsScene(0, 0, 1000, 1000)
    view1 = QGraphicsView()
    view2 = QGraphicsView()

    item = QGraphicsRectItem(QRectF(0, 0, 40, 40))
    item.setFlag(QGraphicsItem.ItemIsMovable)
    scene.addItem(item)

    view1.setScene(scene)
    view2.setScene(scene)

    w = QWidget()
    layout = QVBoxLayout(w)
    layout.addWidget(view1)
    layout.addWidget(view2)
    w.show()

    sys.exit(app.exec_())

该RECT项目是可移动的,将在两种观点的同时移动。



文章来源: Using Qt model/view framework to notify QGraphicsItem in a view of user-edit made in another view