Не работает отлов событий клавиатуры

Объясните пожалуйста мою ошибку. Создаю окно, вызываю метод отображения этого окна, но почему-то перегрузка метода keyPressEvent не вызывается (т.е. не работает).

class MainWin(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = uic.loadUi("main_win.ui")
        self.win_show()

    def win_show(self):
        self.ui.show()

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Q:
        print("1")
        event.accept()


if __name__ == "__main__":
    App = QApplication(sys.argv)
    main_win = MainWin()
    App.exec_()

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

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

Написав:

self.ui = uic.loadUi("main_win.ui")

вы создаете новый объект, который отличается от объекта self, для которого вы переопределяете keyPressEvent

Вы можете написать:

self.ui = uic.loadUi("test_2.ui", self)   # self !!!

и у вас все заработает, но вам незачем создавать объект self.ui

Сделайте просто:

uic.loadUi("main.ui", self)   # , self !!!



import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.Qt import *


class MainWin(QMainWindow):
    def __init__(self):
        super().__init__()
        
# -        self.ui = uic.loadUi("main_win.ui")     
#        print(self.ui)
# +        self.ui = uic.loadUi("main_win.ui", self)
#        print(self.ui)                   #    ^^^^    !!!!
        
        # Загрузите страницу интерфейса
        uic.loadUi("main_win.ui", self)      
        #                         ^^^^
        self.setFocusPolicy(QtCore.Qt.ClickFocus)      # виджет принимает фокус при нажатии.

    def keyPressEvent(self, event):
#        print(self)
        if event.key() == QtCore.Qt.Key_Q:
            print("Key_Q: 1")
        event.accept()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_win = MainWin()
    main_win.show()
    sys.exit(app.exec_())

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

→ Ссылка