最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - PyQtGraph ROI Mouse Events Not Working Inside QGraphicsProxyWidget - Stack Overflow

programmeradmin4浏览0评论

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!

发布评论

评论列表(0)

  1. 暂无评论