Как добавить действие в QtCore.Qt.DefaultContextMenu на Qdoublespinbox на правой Cilck? - PullRequest
0 голосов
/ 27 ноября 2018

Я разработал довольно сложный инструмент с графическим интерфейсом, используя Qt Designer.

Более подробную информацию об этом инструменте смотрите: https://github.com/3fon3fonov/trifon

Я определил много записей QDoubleSpinBox и попо умолчанию Qt Designer устанавливает свою политику меню правой кнопки мыши на:

setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)

Теперь я хочу добавить еще несколько действий в это меню, но я просто не могу понять, как это работает!В Qt Designer нет ничего, что позволило бы мне создать CustomContextMenu.Я понимаю, что для этого мне может понадобиться некоторое кодирование (с которым мне понадобится помощь, и поэтому я прошу помощи здесь), но мне также нужно сделать это глобально для всех SpinBox-ов.

Извините зане размещать код, так как он достаточно велик для этой формы.Если вы заинтересованы, пожалуйста, посмотрите на github в "gui.py".Тем не менее, там и в файле .ui нет никаких признаков возможности управления политикой контекстного меню для этих кнопок.Вместо этого я публикую изображение инструмента (извините за плохое изображение, но PrtSc, похоже, не работает, когда нажата правая кнопка и отображается меню)

см. Изображение GUI здесь

1 Ответ

0 голосов
/ 27 ноября 2018

Поскольку мы хотим добавить QAction в контекстное меню по умолчанию, мы сначала перезаписываем событие contextMenuEvent и используем QTimer для вызова функции, которая фильтрует toplevels и получает отображаемое QMenuи там мы добавляем QAction:

doublespinbox.py

from PyQt5 import QtCore, QtWidgets

class DoubleSpinBox(QtWidgets.QDoubleSpinBox):
    minimize_signal = QtCore.pyqtSignal()

    def __init__(self, *args, **kwargs):
        super(DoubleSpinBox, self).__init__(*args, **kwargs)
        self.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)

    def contextMenuEvent(self, event):
        QtCore.QTimer.singleShot(0, self.add_actions)
        super(DoubleSpinBox, self).contextMenuEvent(event)

    @QtCore.pyqtSlot()
    def add_actions(self):
        for w in QtWidgets.QApplication.topLevelWidgets():
            if isinstance(w, QtWidgets.QMenu) and w.objectName() == "qt_edit_menu":
                w.addSeparator()
                minimize_action = w.addAction("minimize this parameter")
                minimize_action.triggered.connect(self.minimize_signal)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = DoubleSpinBox()
    w.show()
    sys.exit(app.exec_())

Чтобы использовать DoubleSpinBox в Qt Designer, первое место doublespinbox.py рядом с вашим .ui:

├── ..
├── rvmod_gui.ui
├── doublespinbox.py   
├── ...

, затем вы должны продвинуть виджет, чтобы сделать это, щелкните правой кнопкой мыши на QDoubleSpinBox и выберите опцию «Повышать до ...», добавив следующее кдиалоговое окно:

enter image description here

Затем нажмите кнопку «Добавить» и затем кнопку «Повышение».

Для других QDoubleSpinBox щелкните правой кнопкой мышии выберите новую опцию Повышение до, где опция DoubleSpinBox.


Вы можете найти пример здесь

...