QGraphicsItem在光标离开时位于另一个对象上方

时间:2019-07-10 06:14:07

标签: qt qgraphicsview qgraphicsscene qgraphicsitem

我有一个QGraphicsScene,QGraphicsView和一些QGraphicsItems子类。 我想跟踪哪个项目在光标最上方可见。 在大多数情况下,使用hoverEnterEvent可以很好地工作,但是如果我有两个对象,其中一个对象位于另一个对象之上,则确实可以同时输入两个对象,但不能离开内部对象(并重新进入外部对象,因为它从未在内部离开外部对象)第一名)。

           +-------------------------------------+
  outside  |                                     |
           |  outer                              |
           |                                     |
           |                                     |
           |           +-------------+           |     +-------------+ 
           |           |             |           |     |             | 
           |           |             |           |     |   another   |
           |           |    inner    |           |     |             |
           |           |             |           |     |             |
           |           |             |           |     +-------------+ 
           |           +-------------+           |
           |                                     |
           |                                     |
           |                                     |
           |                                     |
           +-------------------------------------+

outside -> outer : works, outer is selected
outside -> outer -> outside -> another : works, first outside is selected, than nothing, than another
outer -> inner : works, inner is seletected
outside -> outer -> inner -> outer: does not work, first outside is selected, than inner, but than nothing (should be outer again)

除了循环通过hoverLeaveEvent的轻微延迟单触发触发的所有图形项目外,我还能做什么?

编辑: 我找到了一个临时解决方案: 我添加了一个全局QList ,在MyQGraphicsItem :: hoverEnterEvent上我添加了“ this”,在MyGraphicsItem :: hoverLeaveEvent上我删除了列表中的最后一项。因此,myGlobalQList.last()始终包含光标下方可见的最上面的项目。 我认为这不是最佳解决方案,因为QList不是线程安全的,因此我仍然对其他解决方案感兴趣。

1 个答案:

答案 0 :(得分:0)

您的QGraphicsItem位于QGraphicsScene中,可以由一个或多个 QGraphicsView s显示。

我知道模型视图映射通常是1:1。

仍然建议您在视图中而不是在场景中实现这样的鼠标处理:

eventFilter上安装graphicsView->viewport()

覆盖过滤器类中的eventFilter()函数。

根据需要,注意QEvent::MousePressMouseMoveMouseRelease,也许是EnterLeave

可能您需要在视口上setMouseTracking(true)

然后,在事件过滤器功能中,使用QGraphicsView::mapToScene()QGraphicsScene::itemAt()查找最高的项目,或使用::items()查找光标下方的所有项目。

最近,我通过在视图(QGraphicsView::drawForeground())上绘画来用边框装饰最上面的项目。