QGraphicsItem的重载鼠标事件求解

时间:2022-03-03 23:24:02
QGraphicsView框架,画N条线(继承QGraphicsItem)

要求对线可以进行鼠标悬停高亮,拖拽功能
所以,需要重写hoverEnterEvent()/mousePressEvent()这些函数

但是遇到个问题,有多条线交叉的时候,就很难捕捉到这个鼠标事件
初步估计是因为重载QGraphicsItem时候,需要重写bindingRect()函数,返回的该条线所在的矩形区域
这样就导致有的线的矩形区域遮住了其他线的矩形区域,所以被遮罩的线,就捕捉不到鼠标事件

Qt的机制就是这样吗?
怎样保证多个QGraphicsItem交叠的时候,能顺利捕捉到对应的时间

7 个解决方案

#1


使用QGraphicsLineItem

#2


引用 1 楼 kuyucman 的回复:
使用QGraphicsLineItem

我需要画一个自定义图形的线,不是调用简单的线

#3


响应hover的应当是Z轴最高或同Z值但最后insert进去的;

在Hover事件里,可以获取到光标的坐标,再调用scene的itemAt获取当前光标下的所有items,再去高亮它们

#4


引用 3 楼 kuyucman 的回复:
响应hover的应当是Z轴最高或同Z值但最后insert进去的;

在Hover事件里,可以获取到光标的坐标,再调用scene的itemAt获取当前光标下的所有items,再去高亮它们


那如果按这个说法的话,处理鼠标悬停事件,应该是在QGraphicsScene里处理,而不是在QGraphiscItem里处理

#5


恩,在QGraphicsScene::mouseMoveEvent更好点

#6


引用 5 楼 kuyucman 的回复:
恩,在QGraphicsScene::mouseMoveEvent更好点


有个问题,比如说我有N个Item重合在一起
我想让指定的item置于Scene最顶层,有这个函数吗?

#7


我是这样实现的:

获取跟该item所有相交的items,然后遍历这些Items,求出最大的Z值的item,设该值为max_z_val,

然后在该item中调用QGraphicsItem::setZValue(max_z_val+0.1)

#1


使用QGraphicsLineItem

#2


引用 1 楼 kuyucman 的回复:
使用QGraphicsLineItem

我需要画一个自定义图形的线,不是调用简单的线

#3


响应hover的应当是Z轴最高或同Z值但最后insert进去的;

在Hover事件里,可以获取到光标的坐标,再调用scene的itemAt获取当前光标下的所有items,再去高亮它们

#4


引用 3 楼 kuyucman 的回复:
响应hover的应当是Z轴最高或同Z值但最后insert进去的;

在Hover事件里,可以获取到光标的坐标,再调用scene的itemAt获取当前光标下的所有items,再去高亮它们


那如果按这个说法的话,处理鼠标悬停事件,应该是在QGraphicsScene里处理,而不是在QGraphiscItem里处理

#5


恩,在QGraphicsScene::mouseMoveEvent更好点

#6


引用 5 楼 kuyucman 的回复:
恩,在QGraphicsScene::mouseMoveEvent更好点


有个问题,比如说我有N个Item重合在一起
我想让指定的item置于Scene最顶层,有这个函数吗?

#7


我是这样实现的:

获取跟该item所有相交的items,然后遍历这些Items,求出最大的Z值的item,设该值为max_z_val,

然后在该item中调用QGraphicsItem::setZValue(max_z_val+0.1)