When I place a PyQtGraph PlotWidget
with ROIs inside a QGraphicsProxyWidget
, the ROIs don't respond to some of the mouse interactions. Except the hover events, no operations work with the ROI e.g. drag, click, etc.
However, the same ROI works perfectly when:
- The PlotWidget is used as a standalone widget
- The PlotWidget is placed inside a QMdiSubWindow
Code Example
Here's a minimal reproducible example:
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__()
# Create PlotWidget
self.plot = pg.PlotWidget()
self.plot.showGrid(True, True)
self.plot.setBackground('w')
# Add plot to layout
layout = QVBoxLayout(self)
layout.addWidget(self.plot)
# Add a rectangle 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)
# Failing case: ROI doesn't respond to mouse events
if __name__ == '__main__':
app = QApplication([])
plot = Plot()
view = QGraphicsView()
scene = QGraphicsScene()
proxy = scene.addWidget(plot)
view.setScene(scene)
view.show()
app.exec()
Working Examples
# Case 1: ROI works in standalone widget
if __name__ == '__main__':
app = QApplication([])
plot = Plot()
plot.show()
app.exec()
# Case 2: ROI works in QMdiSubWindow
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()
Expected Behavior
The ROI should respond to mouse events such as clicking, and dragging, just as it does when the PlotWidget is used directly or in a QMdiSubWindow.
Actual Behavior
When using QGraphicsProxyWidget, the ROI doesn't respond to the clicking and dragging interactions, and the signals (sigClicked, sigRegionChangeStarted, etc.) are not triggered.
What I've Tried
I've attempted to:
- Set different mouse event flags for the proxy widget
- Explicitly set event filter on the proxy widget
- Check if setHandlesChildEvents affects behavior
- Compare different Qt widget containers (QMdiSubWindow works, QGraphicsProxyWidget doesn't)
Is there a way to make ROIs respond to mouse events when wrapped in a QGraphicsProxyWidget? Any insights or solutions would be greatly appreciated!