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

PyQtGraph ROI嵌入QGraphicsProxyWidget后鼠标交互失效的问题求助

PyQtGraph ROI嵌入QGraphicsProxyWidget后鼠标交互失效的问题求助

我最近做项目时碰到了一个棘手的问题:当把带有ROI(感兴趣区域)的PyQtGraph PlotWidget通过QGraphicsProxyWidget嵌入到图形场景中时,ROI几乎不响应任何鼠标交互——只有悬停事件能正常触发,点击、拖拽这些操作完全没效果,绑定的sigClicked、sigRegionChangeStarted这类信号也都不会被触发。

但同样的ROI在两种场景下工作完全正常:

  • 直接将PlotWidget作为独立窗口部件使用
  • 把PlotWidget放到QMdiSubWindow中

最小复现代码

下面是能复现问题的最简代码:

from PySide6.QtWidgets import QApplication, QVBoxLayout, QWidget, QGraphicsScene, QGraphicsView
from PySide6.QtCore import Qt
import pyqtgraph as pg

class Plot(QWidget):
    def __init__(self):
        super().__init__()
        # 创建PlotWidget
        self.plot = pg.PlotWidget()
        self.plot.showGrid(True, True)
        self.plot.setBackground('w')

        # 将PlotWidget添加到布局
        layout = QVBoxLayout(self)
        layout.addWidget(self.plot)

        # 添加矩形ROI
        roi = pg.RectROI([0, 0], [1, 1], pen='r')
        roi.setAcceptedMouseButtons(Qt.LeftButton)
        roi.sigClicked.connect(lambda: print("Clicked"))
        roi.sigHoverEvent.connect(lambda: print("Hovering"))
        roi.sigRegionChangeStarted.connect(lambda: print("Region change started"))
        roi.sigRegionChangeFinished.connect(lambda: print("Region change ended"))
        self.plot.addItem(roi)

# 有问题的场景:ROI仅响应悬停,其他鼠标事件完全失效
if __name__ == '__main__':
    app = QApplication([])
    plot = Plot()
    view = QGraphicsView()
    scene = QGraphicsScene()
    proxy = scene.addWidget(plot)
    view.setScene(scene)
    view.show()
    app.exec()

正常工作的对比案例

案例1:作为独立部件时ROI正常工作

# 正常工作:ROI响应所有鼠标交互与信号
if __name__ == '__main__':
    app = QApplication([])
    plot = Plot()
    plot.show()
    app.exec()

案例2:嵌入QMdiSubWindow时ROI正常工作

# 正常工作:ROI响应所有鼠标交互与信号
if __name__ == '__main__':
    app = QApplication([])
    window = QMainWindow()
    mdi = pg.QtWidgets.QMdiArea()
    window.setCentralWidget(mdi)
    sub = pg.QtWidgets.QMdiSubWindow()
    plot = Plot()
    sub.setWidget(plot)
    mdi.addSubWindow(sub)
    window.show()
    app.exec()

预期与实际行为

预期行为

ROI应该像在独立部件或QMdiSubWindow中一样,正常响应点击、拖拽等所有鼠标交互,对应的信号也能正常触发。

实际行为

当通过QGraphicsProxyWidget包裹时,ROI仅能响应悬停事件,点击、拖拽操作完全无效,sigClicked、sigRegionChangeStarted等信号都不会被触发。


我已经尝试过的方法

为了解决这个问题,我试过以下几种方案,但都没有效果:

  • 给代理部件设置不同的鼠标事件标志
  • 给代理部件显式添加事件过滤器
  • 测试setHandlesChildEvents属性对行为的影响
  • 对比不同Qt容器的表现(发现QMdiSubWindow正常,QGraphicsProxyWidget异常)

现在实在找不到解决思路了,有没有大佬知道怎么让ROI在QGraphicsProxyWidget中正常响应鼠标事件?非常感谢任何建议或解决方案!


备注:内容来源于stack exchange,提问作者Imaduddin Sheikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:45:32