Qt:在鼠标移动过程中更改QGraphicsItem接收器

时间:2015-06-05 14:18:58

标签: qt qgraphicsitem qgraphicsscene qmouseevent

我目前正在尝试实施Bezier笔工具。事件过程如下:

  • 点击点(QGraphicsItem),点击时开始移动
  • 在QGraphicsScene mouseMoveEvent中,阻止point(带有布尔标志)的移动,直到point.pos()到event.scenePos()的距离达到阈值。如果发生这种情况取消选择并且鼠标释放点,添加一个节点(QGraphicsItem) - 选择它并给它mousePress状态(加上取消设置布尔标志)
  • 用户可以在此之后移动节点,然后释放鼠标。

(该节点是该点的子项。)

我试图在场景的mouseMoveEvent中执行此操作(我有一个条件分支,知道何时执行此操作):

point.setSelected(False)
point.ungrabMouse()
node.setPos(event.scenePos()-point.pos()) # positioning relative to point since it’s a childItem()
node.grabMouse()
event.accept()

但是在这样做之后发现节点在我释放鼠标后才获得mouseMoveEvent ...(我在控制台中打印它们,节点本身没有移动。)

所以我想,也许场景需要在排序"释放焦点"之前吃一个mouseReleaseEvent。我找到了一篇与主题here相切的文章。

那么我没有使用ungrabMouse()/ grabMouse(),而是尝试了这个:

mouseRelease = QEvent(QEvent.MouseButtonRelease)
self.sendEvent(point, mouseRelease)
node.setPos(event.scenePos()-point.pos()) # positioning relative to point since it’s a childItem()
mousePress = QEvent(QEvent.MouseButtonPress)
self.sendEvent(node, mousePress)

现在当我达到距离阈值时,我可以看到只有点被选中(好)然而当我进一步移动时,点和节点都被选中并移动...... 我希望由于我已经取消选择并释放(父)点,所以它不会继续移动。

我链接的文章确实做了不同的事情,但它说"事实证明,我们必须模拟鼠标释放事件以清除Qt的内部状态。"这可能与目前的情况有关但是我不知道为了“清除Qt的内部状态”可能需要采取哪些额外措施......所以我希望QGraphics爱好者可以权衡并帮助我解决这个问题。 / p>

感谢您一看。

1 个答案:

答案 0 :(得分:0)

发送鼠标事件和手动抓取鼠标的组合工作......必须在mouseRelease上手动打开。