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在这里不起作用。任何想法如何我可以实现这一目标?
我个人更喜欢在使用场景视图框架时使用ItemChange(...)。避免使用mouseMoveEvent。
要禁用itemChange,您可以将项目设置为不可移动。
{
setFlag(QGraphicsItem::ItemSendsGeometryChanges , false);
...
setFlag(QGraphicsItem::ItemSendsGeometryChanges , true);
}
前不要发射事件之前进行检查,但在接收功能。当我选择多个项目并移动它们时会失败,因为只有我拖动的项目才会收到mouseMoveEvents,那些正在为这次骑行顺利进行的项目会越过象限边界。我现在检查并调整itemChange()中的“对象位置”,并且为了避免递归,我返回调整后的位置。这类作品,但我的物体跳动和闪烁,因为它们实际上明显移动到给定的边界之外,然后在itemChange中追溯调整。我怎样才能避免这种情况? – zeus300
有两个与轻弹相关的调用,QGraphicsView :: setCacheMode(QGraphicsView :: CacheBackground); QGraphicsView :: setViewportUpdateMode(QGraphicsView :: BoundingRectViewportUpdate); –
您处理的意见不使用任何mouseMoveEvent +1 – SteakOverflow