Поведение, с которым вы сталкиваетесь, не связано с курсором мыши, а связано с клавиатурой фокус (вы можете установить фокус на виджет, щелкнув по нему, хотя).
Проблема в том, что виджеты 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)