这是 Qt 的GraphicsItem的一项优化造成的,因为GraphicsItem不像QWidget只有很少的实例,GraphicsItem实例可以非常多,甚至可以到百万个,所以每次鼠标移动都去分发mouse move事件开销太大了,而且没必要,真正需要mouse move事件的item是很少的。
但是 Qt 提供了一个开关选项
void QGraphicsItem::setAcceptHoverEvents ( bool enabled )
打开这个选项,就可以接收到以下事件了
hoverEnterEvent(), hoverMoveEvent(), and hoverLeaveEvent().
那么mouseMoveEvent呢?在Qt Graphics item里mouse 的move和hover是不一样的。
hover是指鼠标经过,但是鼠标任何按键没有按下
move是指按下鼠标键后拖动,所以要先响应 mousePressEvent 返回 accepted,然后才会接收到move,只有响应了press的那个item才能接收到后续的move,直到mouseReleaseEvent。