Preeventing QGraphicsItem的itemChanged

Preeventing QGraphicsItem的itemChanged

问题描述:

我有一个QGraphicsItem,用户可以拖动。我想保留的项目在我的场景的右上象限,所以我推翻mouseMoveEvent这样的:Preeventing QGraphicsItem的itemChanged

def mouseMoveEvent(self, event): 
    if self.x() < 0: 
     self.setPos(0, self.y()) 
    if self.y() + self.rect().height() > 0: 
     self.setPos(self.x(), -self.rect().height()) 

工程就像一个魅力,到目前为止,一切顺利。

现在我使用itemChanged来启动项目移动时的计算。尽管当我的物品到达我定义的边界时,我的物品仍保持静止,但当鼠标处于“禁区”时,itemChanged也会被调用,这是可以理解的。 我想根据上述检查来阻止这种行为。由于QGraphicsItem不是QObject,所以blockSignals在这里不起作用。任何想法如何我可以实现这一目标?

+0

您处理的意见不使用任何mouseMoveEvent +1 – SteakOverflow

我个人更喜欢在使用场景视图框架时使用ItemChange(...)。避免使用mouseMoveEvent。

要禁用itemChange,您可以将项目设置为不可移动。

{ 
    setFlag(QGraphicsItem::ItemSendsGeometryChanges , false); 
... 
    setFlag(QGraphicsItem::ItemSendsGeometryChanges , true); 
} 
+0

前不要发射事件之前进行检查,但在接收功能。当我选择多个项目并移动它们时会失败,因为只有我拖动的项目才会收到mouseMoveEvents,那些正在为这次骑行顺利进行的项目会越过象限边界。我现在检查并调整itemChange()中的“对象位置”,并且为了避免递归,我返回调整后的位置。这类作品,但我的物体跳动和闪烁,因为它们实际上明显移动到给定的边界之外,然后在itemChange中追溯调整。我怎样才能避免这种情况? – zeus300

+0

有两个与轻弹相关的调用,QGraphicsView :: setCacheMode(QGraphicsView :: CacheBackground); QGraphicsView :: setViewportUpdateMode(QGraphicsView :: BoundingRectViewportUpdate); –