Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Is it possible to capture mouse in QGraphicsView?



  • Hi,

    I've created a UI file with the Editor, it does contain a QGraphicsView (promoted to QChart) and I would like to know if it's possible to capture the mouse click events on the QChart (or QGraphicsView) and handle them in order to show a context menu when right-click on the chart.

    From a slight research it seems to me I need to Subclass the QGraphicsView and implement an eventFilter, is that right?

    I'm using PySide2 and fbs (to generate the application installer). Here's how I load the UI into PySide2:

    class UiLoader(QUiLoader):
        """
        Override the createWidget method so we can load a promoted QGraphicsView
        otherwise the QUiLoader is not able to load it
        """
    
        def createWidget(self, classname, parent=None, name=""):
            if classname == "QChartView":
                return QtCharts.QChartView(parent)
            return super().createWidget(classname, parent, name)
    
    class AppContext(ApplicationContext):
    
        def __init__(self, *args, **kwargs):
            super(AppContext, self).__init__()
    
            # Load UI file
            ui_file = self.get_resource("mainwindow.ui")
            self.file = QFile(ui_file)
            self.file.open(QFile.ReadOnly)
    
            self.loader = UiLoader()
            self.window = self.loader.load(self.file)
    
        def run(self):
            self.app.setStyle('Fusion')
    
            # Creating QChart
            # https://doc.qt.io/qtforpython-5/tutorials/datavisualize/add_chart.html  # noqa: E501
            self.chart = QtCharts.QChart()
            self.chart.setAnimationOptions(QtCharts.QChart.AllAnimations)
    
            # Chart steps setup, etc...
    
            # Creating QChartView
            self.window.graphicsView.setChart(self.chart)
            self.window.graphicsView.setRenderHint(QPainter.Antialiasing)
    
    if __name__ == '__main__':
        appctxt = AppContext()
        exit_code = appctxt.run()
        sys.exit(exit_code)
    


  • @CarlosDiaz

    in order to show a context menu when right-click on the chart

    I don't know anything about QChart. But for QGraphicsView there is QGraphicsView::contextMenuEvent(). See the PyQt example at https://stackoverflow.com/a/14972629/489865 ?


Log in to reply