我正在尝试设计一个多视图应用程序以使用Qt的模型/视图框架,以便可以将许多复杂的逻辑移出QGraphicsItem
类。
如下图所示,该应用程序由两个(或多个)视图组成,每个视图包含一系列相同的红色垂直指南线A1
,B1
和C1
。沿每个视图处于相同的水平位置。
我想确保在用户将一个指导线视图(例如,从点A1
拖动到A_1'
时,如上图所示)时,其他视图中的所有对应指导线以相同的距离和相同的方向移动,例如从A2
到A2'
。同样,不可能将一条指导线拖到另一条指导线上,即指导线必须保持其相对顺序。这是我想从GuideLine类移入模型的逻辑的一部分。
我知道拖动参考线会触发QGraphicsItem :: itemChange,如下面的代码片段所示。我不知道如何最好
QGraphicsItem::itemChange
必须立即返回经过验证的值,而它不能依赖异步信号时隙机制。A1
和B1
之间不断地相互通知。-
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
答案 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项目是可移动的,并且将同时在两个视图中移动。