Qt:在鼠标移动期间更改QGraphicsItem接收器
我目前正在尝试实现一个贝塞尔笔工具。事件的过程如下所示:Qt:在鼠标移动期间更改QGraphicsItem接收器,qt,qgraphicsitem,qgraphicsscene,qmouseevent,Qt,Qgraphicsitem,Qgraphicsscene,Qmouseevent,我目前正在尝试实现一个贝塞尔笔工具。事件的过程如下所示: 单击点(QGraphicsItem),在单击的同时开始移动 在QGraphicscene mouseMoveEvent中,在point.pos()到event.scenePos()的距离达到阈值之前,防止点移动(使用布尔标志)。当这种情况发生时,取消选择鼠标释放点,添加一个节点(QGraphicsItem)–选择它并给它鼠标按下状态(加上取消设置布尔标志) 用户可以在此之后移动节点,然后释放鼠标 (节点是点的子项。) 我尝试在场景的m
- 单击点(QGraphicsItem),在单击的同时开始移动
- 在QGraphicscene mouseMoveEvent中,在point.pos()到event.scenePos()的距离达到阈值之前,防止点移动(使用布尔标志)。当这种情况发生时,取消选择鼠标释放点,添加一个节点(QGraphicsItem)–选择它并给它鼠标按下状态(加上取消设置布尔标志)
- 用户可以在此之后移动节点,然后释放鼠标
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的爱好者能参与进来,帮助我解决这个问题
感谢您查看这里。发送鼠标事件和手动抓取鼠标的组合可以工作…但是必须在mouseRelease上手动取消抓取。发送鼠标事件和手动抓取鼠标的组合可以工作…但是必须在mouseRelease上手动取消抓取鼠标。您的小部件上是否激活了捕鼠器<代码>QWidget::setMouseTracking(true)代码>@JohannesMunk嗨,Johannes,也许我的帖子不清楚:我愿意做的基本上是:-单击点,在单击时开始移动-在QGraphicscene mouseMoveEvent中,当点到事件的距离达到阈值时,取消选择并释放点,繁殖节点-选择它并给它鼠标按下状态-用户可以在之后继续移动节点,然后释放鼠标。不必使用setMouseTracking,这一切都可行吗(真的)?我想将小部件设置为mousePress状态,这样就不必总是跟踪鼠标。谢谢你为什么要避免捕鼠器?@JohannesMunk,因为这是一个额外的选择层功能,我认为可以通过发布和按下来实现,不是吗?我怀疑你能做到这一点。我从来没有遇到过捕鼠器的麻烦。澄清一下:如果你启用了它,一切正常?你的小部件上是否激活了捕鼠器<代码>QWidget::setMouseTracking(true)代码>@JohannesMunk嗨,Johannes,也许我的帖子不清楚:我愿意做的基本上是:-单击点,在单击时开始移动-在QGraphicscene mouseMoveEvent中,当点到事件的距离达到阈值时,取消选择并释放点,繁殖节点-选择它并给它鼠标按下状态-用户可以在之后继续移动节点,然后释放鼠标。不必使用setMouseTracking,这一切都可行吗(真的)?我想将小部件设置为mousePress状态,这样就不必总是跟踪鼠标。谢谢你为什么要避免捕鼠器?@JohannesMunk,因为这是一个额外的选择层功能,我认为可以通过发布和按下来实现,不是吗?我怀疑你能做到这一点。我从来没有遇到过捕鼠器的麻烦。澄清一下:如果你启用了它,一切正常?你的小部件上是否激活了捕鼠器<代码>QWidget::setMouseTracking(true)代码>@JohannesMunk嗨,Johannes,也许我的帖子不清楚:我愿意做的基本上是:-单击点,在单击时开始移动-在QGraphicscene mouseMoveEvent中,当点到事件的距离达到阈值时,取消选择并释放点,繁殖节点-选择它并给它鼠标按下状态-用户可以在之后继续移动节点,然后释放鼠标。不必使用setMouseTracking,这一切都可行吗(真的)?我想将小部件设置为mousePress状态,这样就不必总是跟踪鼠标。谢谢你为什么要避免捕鼠器?@JohannesMunk,因为这是一个额外的选择层功能,我认为可以通过发布和按下来实现,不是吗?我怀疑你能做到这一点。我从来没有遇到过捕鼠器的麻烦。澄清一下:如果你启用了它,一切都正常吗?
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)