使用Qt模型/视图框架在另一个视图中进行的用户编辑视图中通知QGraphicsItem

时间:2019-06-26 08:20:08

标签: pyside qgraphicsitem model-view

我正在尝试设计一个多视图应用程序以使用Qt的模型/视图框架,以便可以将许多复杂的逻辑移出QGraphicsItem类。

如下图所示,该应用程序由两个(或多个)视图组成,每个视图包含一系列相同的红色垂直指南线A1B1C1。沿每个视图处于相同的水平位置。

enter image description here

我想确保在用户将一个指导线视图(例如,从点A1拖动到A_1'时,如上图所示)时,其他视图中的所有对应指导线以相同的距离和相同的方向移动,例如从A2A2'。同样,不可能将一条指导线拖到另一条指导线上,即指导线必须保持其相对顺序。这是我想从GuideLine类移入模型的逻辑的一部分。

我知道拖动参考线会触发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

1 个答案:

答案 0 :(得分:0)

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项目是可移动的,并且将同时在两个视图中移动。