You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySide6中QGraphicsEllipseItem的hoverEnterEvent不触发如何解决

问题原因
  • 重写GraphicsScene的mouseMoveEvent方法时,未调用父类QGraphicsScene的默认事件实现,且逻辑仅处理左键按下时的拖拽场景,所有非左键按下状态的鼠标移动事件被直接拦截丢弃。QGraphics框架的悬停事件依赖场景默认的鼠标移动监听逻辑,通过实时计算鼠标所在位置的图元完成事件派发,事件被截断后悬停检测逻辑完全不运行,自然无法触发图元的hoverEnterEvent。
  • mouseReleaseEvent中创建终点端口时,使用的是原生QGraphicsEllipseItem类,而非你自定义的实现了悬停逻辑、开启了悬停接收的Ellipse类,这部分生成的圆形图元本身就不具备悬停响应能力。
修改方案
  1. 修改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)
    
  2. 修改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)
    
  3. (规范优化)在Ellipse类的hoverEnterEvent中调用父类实现,避免破坏框架默认的事件处理逻辑:
    def hoverEnterEvent(self, event) -> None:
        print("hovered")
        super().hoverEnterEvent(event)
    

修改完成后运行,鼠标移动到圆形端口上时就会正常打印hovered日志,悬停事件生效。

内容的提问来源于stack exchange,提问作者YacineCino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:36:07