我目前正在尝试实施Bezier笔工具。事件过程如下:
(该节点是该点的子项。)
我试图在场景的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>
感谢您一看。
答案 0 :(得分:0)
发送鼠标事件和手动抓取鼠标的组合工作......必须在mouseRelease上手动打开。