Qt:在鼠标移动期间更改 QGraphicsItem 接收器
Qt: change QGraphicsItem receiver during mouse move
我目前正在尝试实现贝塞尔钢笔工具。事件的过程是这样的:
- 点击点(QGraphicsItem),点击开始移动
- 在 QGraphicsScene mouseMoveEvent 中,防止点移动(使用布尔标志),直到从 point.pos() 到 event.scenePos() 的距离达到阈值。当这种情况发生时,unselect 和 mouseRelease 点,添加一个节点 (QGraphicsItem) – select 它并给它 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……(我在控制台打印它们,节点本身没有移动。)
所以我想,也许场景需要在 "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 上手动取消抓取。
我目前正在尝试实现贝塞尔钢笔工具。事件的过程是这样的:
- 点击点(QGraphicsItem),点击开始移动
- 在 QGraphicsScene mouseMoveEvent 中,防止点移动(使用布尔标志),直到从 point.pos() 到 event.scenePos() 的距离达到阈值。当这种情况发生时,unselect 和 mouseRelease 点,添加一个节点 (QGraphicsItem) – select 它并给它 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……(我在控制台打印它们,节点本身没有移动。)
所以我想,也许场景需要在 "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 上手动取消抓取。