расширяющий QSpinBox ContextMenu - PullRequest
1 голос
/ 05 марта 2019

Чувствую, что я искал везде, но не могу найти ответ на этот вопрос.Интересно, есть ли способ добавить дополнительные QActions в QSpinBox ContextMenu?В идеале к началу списка действий.

Я знаю, что вы можете заменить меню по умолчанию, как показано ниже, но можно выяснить, как его расширить:

import sys
from PyQt4 import QtGui, QtCore


class QSpinBox(QtGui.QSpinBox):
    def __init__(self, *args, **kargs):
        QtGui.QSpinBox.__init__(self, *args, **kargs)
        self.resize(200, 60)

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

    def __contextMenu(self):
        self._normalMenu = self.build_menu()
        self._normalMenu.exec_(QtGui.QCursor.pos())

    def build_menu(self):
        self.menu = QtGui.QMenu(self)

        self.save = QtGui.QAction("Save", self)
        self.menu.addAction(self.save)

        self.reset = QtGui.QAction("Reset", self)
        self.menu.addAction(self.reset)

        return self.menu


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    form = QSpinBox()
    form.show()
    sys.exit(app.exec_())

Меню по умолчанию:

enter image description here

Опции, которые я хотел бы добавить к началу:

enter image description here

Заранее благодарим за любую помощь,

Марк

1 Ответ

2 голосов
/ 05 марта 2019

Хитрость заключается в том, чтобы получить QMenu через мгновение после его отображения, используя findChild() с QTimer.singleShot():

from PyQt4 import QtCore, QtGui

class SpinBox(QtGui.QSpinBox):
    def contextMenuEvent(self, event):
        QtCore.QTimer.singleShot(0, self.on_timeout)
        super(SpinBox, self).contextMenuEvent(event)

    @QtCore.pyqtSlot()
    def on_timeout(self):
        menu = self.findChild(QtGui.QMenu, 'qt_edit_menu')
        if menu is not None:
            first_action = menu.actionAt(QtCore.QPoint())
            save_action = QtGui.QAction(
                "Save", 
                menu, 
                shortcut=QtGui.QKeySequence.Save,
                triggered=self.on_save_triggered
            )
            reset_action = QtGui.QAction(
                "Reset", 
                menu, 
                triggered=self.on_reset_triggered
            )
            menu.insertAction(first_action, save_action)
            menu.insertAction(save_action, reset_action)
            menu.insertSeparator(first_action)

    @QtCore.pyqtSlot()
    def on_save_triggered(self):
        print("save")

    @QtCore.pyqtSlot()
    def on_reset_triggered(self):
        print("reset")

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = SpinBox()
    w.resize(600, w.sizeHint().height())
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...