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