PySide6中QGraphicsEllipseItem的hoverEnterEvent不触发如何解决
问题原因
- 重写
GraphicsScene的mouseMoveEvent方法时,未调用父类QGraphicsScene的默认事件实现,且逻辑仅处理左键按下时的拖拽场景,所有非左键按下状态的鼠标移动事件被直接拦截丢弃。QGraphics框架的悬停事件依赖场景默认的鼠标移动监听逻辑,通过实时计算鼠标所在位置的图元完成事件派发,事件被截断后悬停检测逻辑完全不运行,自然无法触发图元的hoverEnterEvent。 mouseReleaseEvent中创建终点端口时,使用的是原生QGraphicsEllipseItem类,而非你自定义的实现了悬停逻辑、开启了悬停接收的Ellipse类,这部分生成的圆形图元本身就不具备悬停响应能力。
修改方案
- 修改
GraphicsScene的mouseMoveEvent,在自定义逻辑执行完成后,调用父类的事件实现,保证默认的事件派发、悬停检测逻辑正常运行:def mouseMoveEvent(self, event): if event.buttons() == Qt.MouseButton.LeftButton: print(f"moving, x : {event.scenePos().x()}, y : {event.scenePos().y()}") self.end_pos = event.scenePos() try: self.update_path() except AttributeError: pass # 透传事件给父类默认实现 super().mouseMoveEvent(event) - 修改
mouseReleaseEvent中创建终点端口的逻辑,替换为自定义的Ellipse类,保证所有生成的端口图元都支持悬停响应:else: x = event.scenePos().x() + 1 y = event.scenePos().y() + 1 # 替换为自定义Ellipse类 end_port = Ellipse() end_port.setPos(x - 6, y - 6) end_port.setPen(self._port_pen) end_port.setBrush(self._port_brush) end_port.setZValue(10000.0) self.addItem(end_port) - (规范优化)在
Ellipse类的hoverEnterEvent中调用父类实现,避免破坏框架默认的事件处理逻辑:def hoverEnterEvent(self, event) -> None: print("hovered") super().hoverEnterEvent(event)
修改完成后运行,鼠标移动到圆形端口上时就会正常打印hovered日志,悬停事件生效。
内容的提问来源于stack exchange,提问作者YacineCino
相关产品推荐
相关产品推荐

