Не перехватывается событие нажатия клавиши PyQt5
Делаю приложение на PyQt5. У меня есть вот такое окно:
Я хочу с помощью keyPressEvent перехватывать все нажатия клавиш в этом окне.
Большинство нажатий клавиш я перехватываю, но вот при нажатии стрелочек на нумпаде этот метод не работает, потому что это считается не за событие нажатия клавиши, а за какое-то другое событие, которое выделяет кнопку.
На картинке видно, что кнопка выделилась пунктиром:
Если кнопку удалить, то все клавиши перехватываются правильно.
Как можно обойти эту проблему и перехватывать все нажатия клавиш?
from PyQt5.QtWidgets import *
import sys
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.resize(430, 130)
self.label = QLabel(self)
self.label.setText('Нажмите на клавиатуре нужное вам сочетание клавиш')
self.label.resize(400, 50)
self.label.move(10, 10)
self.button = QPushButton(self)
self.button.setText('Создать сочетание клавиш')
self.button.resize(400, 50)
self.button.move(10, 50)
def keyPressEvent(self, event):
print('press')
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
focusPolicy : Qt::FocusPolicy
Это свойство определяет способ, которым виджет принимает фокус клавиатуры.
Больше https://doc.qt.io/qt-5/qwidget.html#focusPolicy-prop
void QWidget::setFocus()
Передает фокус ввода с клавиатуры этому виджету (или его прокси-объекту фокуса), если этот виджет или один из его родителей является активным окном.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(430, 130)
self.centralWidget = QWidget() # !!!
self.setCentralWidget(self.centralWidget) # !!!
self.label = QLabel(self.centralWidget)
self.label.setText('Нажмите на клавиатуре нужное вам сочетание клавиш')
self.label.resize(400, 50)
self.label.move(10, 10)
self.button = QPushButton(self.centralWidget)
self.button.setText('Создать сочетание клавиш')
self.button.clicked.connect(self.onClicked)
self.button.resize(400, 50)
self.button.move(10, 50)
self.button.setFocusPolicy(QtCore.Qt.ClickFocus) # !!!
def keyPressEvent(self, event):
key = event.key()
print(f'press -> {key} -> {event.text()}')
if key == QtCore.Qt.Key_Left:
print(f'Hello -> Key_Left')
elif key == QtCore.Qt.Key_Right:
print(f'Hello -> Key_Right')
self.label.setText(f'Нажмите на клавиатуре нужное вам сочетание клавиш: {event.text()}')
def onClicked(self):
print('Click button')
self.setFocus() # !!!
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())


