<aside>

目次:

</aside>

右クリックメニューの追加

<aside> 💡 PySide6 から QActionがQtWidgetsからQtGuiに移動になっている。

PySide2: QtWidgets.QAction PySide6: QtGui.QAction

</aside>

Examples:

class CustumListWidget(QtWidgets.QListWidget):
    def __init__(self, parent=None):
        super(CustumListWidget, self).__init__(parent)

        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self._setup_context_menu)

    def _setup_context_menu(self, point):
        menu = QtWidgets.QMenu(self)

        action = QtGui.QAction('Menu1', self)
        action.triggered.connect(self.menu1)
        action.setShortcut(QtGui.QKeySequence('Ctrl+Shift+C'))
        menu.addAction(action)

        action = QtGui.QAction('Menu2', self)
        menu.addAction(action)

        menu.addSeparator()

        action = QtGui.QAction('Menu3', self)
        menu.addAction(action)

        menu.exec_(self.mapToGlobal(point))

    def menu1(self):
        item = self.currentItem()
        if item:
            print(item.text())

Eaxamples2

def init_context_menu(self):
    _ui = self.ui.file_browser

    _ui.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
    _ui.customContextMenuRequested.connect(self.setup_context_menu_file_browser)

def setup_context_menu_file_browser(self, point: QtCore.QPoint):
    _ui = self.ui.file_browser

    _menu = QtWidgets.QMenu(_ui)

    _action = QtGui.QAction('Menu1', _ui)
    _action.triggered.connect(_ui.menu1)
    _action.setShortcut(QtGui.QKeySequence('Ctrl+Shift+C'))
    _menu.addAction(_action)

    _menu.addSeparator()

    _action = QtGui.QAction('Menu2', _ui)
    _menu.addAction(_action)

    _menu.exec_(_ui.mapToGlobal(point))

基本画面の作成

import sys

from PySide2 import QtCore, QtGui, QtWidgets

class Test(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)

app = QtWidgets.QApplication(sys.argv)
tool = Test()
tool.show()
app.exec_()

右クリックメニューを設定するWidgetの設定

setContextMenuPolicy を使います。ほとんどのWidgetで使う事が出来ますが、ListWidgetItemなどでは使えない(?)事が多いので、その場合は親クラスのListWidget側で右クリックメニューを設定します。

この目に見える奴らWidgetと呼ばれているものの基底クラスがQWidgetクラスといっているようで、大体のWidgetはこれを継承して拡張されているっぽいです。例えばプッシュボタンのQPushButtonは以下のようになっています。

今回使うsetContextMenuPolicyは、QWidgetクラスの持つ関数のようです。なのでQWidgetから派生してる子のクラスは大体使えるんじゃないかと思います。(未確認)

setContextMenuPolicyのサンプル

import sys

from PySide2 import QtCore, QtGui, QtWidgets

class Test(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Test, self).__init__(parent)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)

app = QtWidgets.QApplication(sys.argv)
tool = Test()
tool.show()
app.exec_()

今回は、リストウィジェットに右クリックメニューを設定してみます。