PyQt6 - Не реагирует на нажатия кнопок-стрелок

Хотел сделать переход на комбинации Ctrl + Alt + <- Ctrl + Alt + ->, но увы, никак не хотят обрабатываться нажатия кнопок стрелок.

На виджете 2 QPushButton, 1 QLabel и 1 QLineEdit

В будущем нужно будет перехватывать комбинации из ОС, пока приложение работает в фоне или не является активным окном

Как решить проблему с перехватом событий кнопок стрелок (Qt.Key.Key_Left, и тп)?
Другие события нажатий отрабатывают корректно (пример с ESC)

    def keyPressEvent(self, event: QKeyEvent):
        modifiers = event.modifiers()
        key = event.key()
        print(modifiers, key)
        print(event.text())

        if key == Qt.Key.Key_Escape.value:
            self.slot_change_counter_name_rejected()


        if modifiers == (
                Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.AltModifier
        ):
            print('here')
            if key == Qt.Key.Key_Left.value:
                self.slot_prev_counter()

            elif key == Qt.Key.Key_Right.value:
                self.slot_next_counter()

        if key == Qt.Key.Key_Left.value:
            self.slot_prev_counter()

        elif key == Qt.Key.Key_Right.value:
            self.slot_next_counter()

UPD:

Идея с шоркатами помогла в плане работы при активном окне. Теперь остается вопрос с глобальными событиями нажатий.

        btn_left.setShortcut(QKeySequence("Ctrl+Shift+Left"))
        btn_left.setEnabled(True)

        btn_right.setShortcut(QKeySequence("Ctrl+Shift+Right"))
        btn_right.setEnabled(True)

UPD 2:

В конце __init__ метода виджета добавил метод, в котором описал глобальные сочетания кнопок. Локальные комбинации остались в keyPressEvent. Это полностью решило проблему.

    def __init__():
        .....
        self._global_keyPressEvent()

    def _global_keyPressEvent(self):
        keyboard.add_hotkey("Ctrl + Alt + Left", self.slot_prev_counter, suppress=True)
        keyboard.add_hotkey("Ctrl + Alt + Right", self.slot_next_counter, suppress=True)

        keyboard.add_hotkey("Ctrl + plus", self.slot_counter_increase, suppress=True)
        keyboard.add_hotkey("Ctrl + -", self.slot_counter_decrease, suppress=True)
    ```

Ответы (1 шт):

Автор решения: S. Nick

Пожалуйста всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

Как вариант:

import sys
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.keymap = {}
        for key, value in vars(Qt).items():
            if isinstance(value, Qt.Key):
                self.keymap[value] = key.partition('_')[2]

        self.modmap = {
            Qt.ControlModifier: self.keymap[Qt.Key_Control],
            Qt.AltModifier: self.keymap[Qt.Key_Alt],
            Qt.ShiftModifier: self.keymap[Qt.Key_Shift],
            Qt.MetaModifier: self.keymap[Qt.Key_Meta],
            Qt.GroupSwitchModifier: self.keymap[Qt.Key_AltGr],
            Qt.KeypadModifier: self.keymap[Qt.Key_NumLock],
        }

        self.label = QLabel()
        self.layout = QGridLayout(self)
        self.layout.addWidget(self.label, 0, 0, alignment=Qt.AlignCenter)

    def keyevent_to_string(self, event):
        sequence = []
        for modifier, text in self.modmap.items():
            if event.modifiers() & modifier:
                sequence.append(text)
        key = self.keymap.get(event.key(), event.text())
        if key not in sequence:
            sequence.append(key)
        return '+'.join(sequence)

    def keyPressEvent(self, event):
        print(self.keyevent_to_string(event))
        self.label.setText(self.keyevent_to_string(event))

        if self.keyevent_to_string(event) == "Control+Q":
            self.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setFont(QFont("Times", 12, QFont.Bold))
    w = Window()
    w.resize(200, 100)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения


Если окно не является активным, вам понадобится дополнительная библиотека, например keyboard.

→ Ссылка