Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt:在鼠标移动期间更改QGraphicsItem接收器_Qt_Qgraphicsitem_Qgraphicsscene_Qmouseevent - Fatal编程技术网

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)–选择它并给它鼠标按下状态(加上取消设置布尔标志)
  • 用户可以在此之后移动节点,然后释放鼠标
(节点是点的子项。)

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

但在执行此操作后,节点仅在我释放鼠标后获得mouseMoveEvent…(我在控制台中打印它们,节点本身没有移动。)

所以我想,在“释放焦点”之前,可能场景需要吃一点老鼠肉。我发现了一篇与主题相切的文章

因此,我没有使用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的爱好者能参与进来,帮助我解决这个问题


感谢您查看这里。

发送鼠标事件和手动抓取鼠标的组合可以工作…但是必须在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)