Search code examples
pythonuser-interfacepyqt5qt5

Add dropdown actions to Pyqt5 frame widget when right-click event is triggered


I have a Qframe widget and I already created an event triger like this

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == Qt.RightButton:
            # do what you want here
            print("Right Button Clicked")
            #showMenuAtMouseLocation()  # to be implemented

I want a small menu list to be added at the mouse location (on the widget) which contains some actions as in the image

I tried adding Qmenu to the frame widget but it doesn't show

class TOCFrame(QFrame):
    def __int__(self):
        QFrame.__int__(self)
        self.menuBar = QMenuBar(self)
        exitMenu = self.menuBar.addMenu('remove')
        self.menuBar.show()

    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button() == Qt.RightButton:
            # do what you want here
            print("Right Button Clicked")
            #showMenuAtMouseLocation()  # to be implemented


Solution

  • You are looking for QContextMenuEvent, and the contextMenuEvent listener.

    You listen for the context menu event by overriding the event listener contextMenuEvent, then you can either create the menu or use a pre-made menu and use the event's globalPos attribute to display it at the point the mouse was clicked.

    class TOCFrame(QFrame):
        def __int__(self):
            QFrame.__int__(self)
            self.menuBar = QMenuBar(self)
            exitMenu = self.menuBar.addMenu('remove')
            self.menuBar.show()
    
        def contextMenuEvent(self, event):
            menu = QMenu(self)
            menu.addAction("Option1")
            menu.addAction("Option2")
            menu.addAction("Option3")
            menu.exec(event.globalPos())
    

    https://doc.qt.io/qt-6/qcontextmenuevent.html