Qt:在鼠标移动期间更改 QGraphicsItem 接收器

Qt: change QGraphicsItem receiver during mouse move

我目前正在尝试实现贝塞尔钢笔工具。事件的过程是这样的:

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

我试图在场景的 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……(我在控制台打印它们,节点本身没有移动。)

所以我想,也许场景需要在 "releasing focus" 之前吃掉 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)

现在 当我达到距离阈值时,我可以看到只有点得到 selected(好)但是当我进一步移动时点和节点被 select 编辑和移动… 我希望因为我没有 select 编辑和释放(父)点,它不会继续移动。

我链接到的文章确实做了一些不同的事情,但它说 "It turns out, we have to simulate a mouse release event to clear Qt’s internal state." 这可能与当前情况有关,但是我不知道可能需要采取哪些额外步骤才能“清除 Qt 的内部state”……所以我希望 QGraphics 爱好者可以参与并帮助我解决这个问题。

感谢您浏览这里。

发送鼠标事件和手动抓取鼠标的组合有效……但是必须在 mouseRelease 上手动取消抓取。