PyQt 5右クリックメニューを実現


QWidgetおよびそのサブクラスは右クリックメニュー機能をサポートし、ContextMenuPolicyを宣言してメニューを有効にする
Qt.DefaultContextMenu
デフォルトメニュー、contextMenuEvent()を書き換えてカスタマイズ
Qt.NoContextMenu
メニューなし、イベント応答が部品の親に渡される
Qt.PreventContextMenu
メニューなし、イベント応答は転送されません
Qt.ActionsContextMenu
[イベント](Event)メニュー:アセンブリイベントのみに応答します.アセンブリサブアセンブリのイベントは応答しません.
Qt.CustomContextMenu
ユーザーがメニューをカスタマイズするには、イベントcustomContextMenuRequestedをバインドし、スロット関数を実装する必要があります.
        # self inherit QWidget
        self.setContextMenuPolicy(Qt.DefaultContextMenu)  # contextMenuEvent()
        self.setContextMenuPolicy(Qt.NoContextMenu)
        self.setContextMenuPolicy(Qt.PreventContextMenu)
        self.setContextMenuPolicy(Qt.ActionsContextMenu)
        self.setContextMenuPolicy(Qt.CustomContextMenu)  # customContextMenuRequested()

 
1、ユーザーメニューを実現する


class handler_demo(QWidget, Ui_demo):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # self inherit QWidget
        self.table_widget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.table_widget.customContextMenuRequested.connect(self.custom_right_menu)

    def custom_right_menu(self, pos):
        menu = QMenu()
        opt1 = menu.addAction("menu1")
        opt2 = menu.addAction("menu2")
        action = menu.exec_(self.table_widget.mapToGlobal(pos))
        if action == opt1:
            # do something
            return
        elif action == opt2:
            # do something
            return
        else:
            return



 
2、イベントメニュー#TODOを使う


class handler_demo(QWidget, Ui_demo):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        # self inherit QWidget
        self.table_widget.setContextMenuPolicy(Qt.ActionsContextMenu)
        self.table_widget.customContextMenuRequested.connect(self.custom_right_menu)

    def custom_right_menu(self, pos):
        menu = QMenu()
        opt1 = menu.addAction("menu1")
        opt2 = menu.addAction("menu2")
        action = menu.exec_(self.table_widget.mapToGlobal(pos))
        if action == opt1:
            # do something
            return
        elif action == opt2:
            # do something
            return
        else:
            return



 
3、デフォルトメニュー#TODOを書き換える

class handler_demo(QWidget, Ui_demo):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def contextMenuEvent(self, event):
        menu = QMenu()
        opt1 = menu.addAction("menu1")
        opt2 = menu.addAction("menu2")
        action = menu.exec_(self.table_widget.mapToGlobal(event.pos()))
        if action == opt1:
            # do something
            return
        elif action == opt2:
            # do something
            return

        menu.move(event.pos())
        menu.show()

 
参考資料
【1】『QT実現右クリックショートカットメニュー』
【2】『QT学習ウィンドウ右ボタン』
【3】『Qt.ContextMenuPolicy』、公式サイト