PyQt5 Shortcut не работает все время - PullRequest
0 голосов
/ 03 августа 2020

Итак, я создаю GUI с PyQt5 и сделал ярлык для моего подменю следующим образом:

        ''' Menubar '''
        mainMenu = self.menuBar()

        ''' Sub-Menubar '''
        fileMenu = mainMenu.addMenu('Options')
        Pathfinder = QAction('Choose Folder', self)
        Pathfinder.setShortcut("Shift+L")
        Pathfinder.triggered.connect(lambda: self.clicked_menu(0))
        fileMenu.addAction(Pathfinder)

Нажатие Shift + L работает нормально ... пока мой курсор мыши не активен в элементе. Например, если я изменяю значение в одном из своих spinBox, и курсор (= каретка) «мигает» внутри spinBox, Shift + L ничего не делает.

        self.spinBoxMaxHolesPerCycle = QSpinBox(self)
        self.spinBoxMaxHolesPerCycle.setGeometry(485, 310, 45, 20)
        self.spinBoxMaxHolesPerCycle.setMaximum(200)
        self.spinBoxMaxHolesPerCycle.setValue(100)
        self.spinBoxMaxHolesPerCycle.valueChanged.connect(lambda: self.changedValue(11))

Есть ли способ обойти это не щелкнуть где-нибудь еще, чтобы "отключить" курсор?

1 Ответ

1 голос
/ 04 августа 2020

Поведение, с которым вы сталкиваетесь, не связано с курсором мыши, а связано с клавиатурой фокус (вы можете установить фокус на виджет, щелкнув по нему, хотя).

Проблема в том, что виджеты QSpinBox содержат QLineEdit, который используется для редактирования значения с помощью клавиатуры, и поскольку ваш ярлык может интерпретироваться как текст (верхний регистр "L "буква"), виджет автоматически "съедает" событие клавиатуры, предотвращая его распространение на родительский элемент.

Если вас интересует только один виджет, вы можете создать его подкласс и переопределить его keyPressEvent, и если он не соответствует ярлыку, просто вызовите базовую реализацию.

Поскольку вы можете захотеть применить поведение более чем к одному виджету, решением будет установка фильтра событий в QApplication и проверка ключа события нажатия: если событие соответствует вашему ярлыку, просто активируйте действие и верните True.

        # ...
        # make the action an attribute, so that it can be accessed from elsewhere
        self.pathfinderAction = QtWidgets.QAction('Choose Folder', self)
        # ...
        QtWidgets.QApplication.instance().installEventFilter(self)

    def eventFilter(self, source, event):
        if (isinstance(source, QtWidgets.QWidget) and 
            event.type() == QtCore.QEvent.KeyPress):
                sequence = QtGui.QKeySequence(int(event.modifiers()) + event.key())
                if sequence == self.pathfinderAction.shortcut():
                    # the event matches the shortcut
                    self.pathfinderAction.trigger()
                    return True
        return super().eventFilter(source, event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...