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
相关产品推荐
相关产品推荐

