Как назначить клавишы клавиатуры на работу с окном в PyQt5 python

Делаю калькулятор на PyQt5 и мне нужно, чтобы при нажатии кнопки Enter в label_result выводился ответ, а когда нажимали кнопку Escape окно закрывалось.

Я пробовал прописать код в самом классе, но программа просто не реагировала на нажатия. Подумал, что проблема в том, что я не то наследую и решил прописать код в отдельном классе, но я не знаю как эти классы связать.

Вот весь код

from math import sqrt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget


class Triggers(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            self.close()


class Ui_Calculator(object):
    def setupUi(self, Calculator):
        Calculator.setObjectName("Calculator")

    def write_number(self, number):
        if self.label_result.text() == '0' or self.isequel == True:
            self.label_result.setText(number)
            self.isequel = False
        else:
            self.label_result.setText(self.label_result.text() + number)
            self.isequel = False

    def clean_label(self):
        self.label_result.setText('')


    def delet_label(self):
        self.label_result.setText(self.label_result.text()[0: -1])


    def result(self):
        self.isequel = True
        self.history_alg(self.label_result.text())
        res = eval(self.label_result.text())
        self.label_result.setText(str(res))


    def history_alg(self, item):
        if self.history.count() < 10:
            self.history.addItem(item)
        else:
            for i in reversed([*range(10)]):
                self.history.setItemText(i, self.history.itemText(i - 1))
            self.history.setItemText(0, item)


    def onActivated(self, text):
        self.label_result.setText(text)



    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()
        elif e.key() == Qt.Key_Return:
            self.result()



    def radical(self):
        self.label_result.setText(str('sqrt(' + self.label_result.text() + ')'))


    def square(self):
        self.label_result.setText(self.label_result.text() + '** 2')



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Calculator = QtWidgets.QMainWindow()
    ui = Ui_Calculator()
    ui.setupUi(Calculator)
    Calculator.show()
    sys.exit(app.exec_())

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

Автор решения: Sergey Tatarincev

для окна надо установить фильтр событий и в нем отслеживать нажатие клавиш:

https://doc.qt.io/qt-5/qobject.html#eventFilter

https://doc.qt.io/qt-5/qobject.html#installEventFilter

def eventFilter(self, obj, event):
    if (event.type() == QtCore.QEvent.KeyPress):
        key = event.key()
        if key == Qt.Key_Escape:
            print("Escape key")
        if key == QtCore.Qt.Key_Enter: 
            print("Enter key")

    return super(MainWindow, self).eventFilter(obj, event)
→ Ссылка
Автор решения: S. Nick

Вы не предоставили свою форму, которую создали в Qt Designer.

Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

from math import sqrt
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget


class Ui_Calculator(object):
    def setupUi(self, Calculator):
        Calculator.setObjectName("Calculator")
        # ?
        # ?
        

class MainWindow(QtWidgets.QMainWindow, Ui_Calculator):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)
        
        self.resize(300, 200)
        self.label_result = QtWidgets.QLabel('2+2', self)
        self.label_result.move(100, 50)
        self.history = QtWidgets.QListWidget(self)
        self.history.move(100, 100)

    def write_number(self, number):
        if self.label_result.text() == '0' or self.isequel == True:
            self.label_result.setText(number)
            self.isequel = False
        else:
            self.label_result.setText(self.label_result.text() + number)
            self.isequel = False

    def clean_label(self):
        self.label_result.setText('')

    def delet_label(self):
        self.label_result.setText(self.label_result.text()[0: -1])

    def result(self):
        self.isequel = True
        self.history_alg(self.label_result.text())
        res = eval(self.label_result.text())
        self.label_result.setText(str(res))

    def history_alg(self, item):
        if self.history.count() < 10:
            self.history.addItem(item)
        else:
            for i in reversed([*range(10)]):
                self.history.setItemText(i, self.history.itemText(i - 1))
            self.history.setItemText(0, item)

    def onActivated(self, text):
        self.label_result.setText(text)

    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()
        elif e.key() == Qt.Key_Return:
            self.result()

    def radical(self):
        self.label_result.setText(str('sqrt(' + self.label_result.text() + ')'))

    def square(self):
        self.label_result.setText(self.label_result.text() + '** 2')
        

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка