简体   繁体   English

keyPressEvent() 方法不适用于 PyQt5/Python 3+

[英]keyPressEvent() method doesn't work for PyQt5 / Python 3+

I'm a newbie for python.我是python的新手。 I've designed a simple calculator app using "Qt Designer" and then convert the "ui" file to "py" using "pyuic5".我使用“Qt Designer”设计了一个简单的计算器应用程序,然后使用“pyuic5”将“ui”文件转换为“py”。

But when I've added keyPressEvent() method, the method didn't work.但是当我添加了 keyPressEvent() 方法时,该方法不起作用。 And I don't know why.我不知道为什么。 I've tried with setFocus() method to overcome this issue but failed.我已经尝试使用 setFocus() 方法来解决这个问题,但失败了。

can anyone help me please?有人可以帮我吗?

Please check my code below:请在下面检查我的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setMinimumSize(QtCore.QSize(330, 280))
        MainWindow.setMaximumSize(QtCore.QSize(330, 280))

        self.centralwidget = QtWidgets.QWidget(MainWindow)


        self.lineEdit_display = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_display.setGeometry(QtCore.QRect(10, 0, 311, 41))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.lineEdit_display.setFont(font)
        self.lineEdit_display.setMaxLength(15)
        self.lineEdit_display.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.lineEdit_display.setReadOnly(True)


        self.pButton_0 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_0.setGeometry(QtCore.QRect(10, 200, 51, 41))
        self.pButton_0.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))

        self.pButton_00 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_00.setGeometry(QtCore.QRect(70, 200, 51, 41))

        self.pButton_dot = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_dot.setGeometry(QtCore.QRect(130, 200, 51, 41))

        self.pButton_1 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_1.setGeometry(QtCore.QRect(10, 150, 51, 41))

        self.pButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_2.setGeometry(QtCore.QRect(70, 150, 51, 41))

        self.pButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_3.setGeometry(QtCore.QRect(130, 150, 51, 41))

        self.pButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_4.setGeometry(QtCore.QRect(10, 100, 51, 41))

        self.pButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_5.setGeometry(QtCore.QRect(70, 100, 51, 41))

        self.pButton_6 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_6.setGeometry(QtCore.QRect(130, 100, 51, 41))

        self.pButton_7 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_7.setGeometry(QtCore.QRect(10, 50, 51, 41))

        self.pButton_8 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_8.setGeometry(QtCore.QRect(70, 50, 51, 41))

        self.pButton_9 = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_9.setGeometry(QtCore.QRect(130, 50, 51, 41))

        self.pButton_add = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_add.setGeometry(QtCore.QRect(210, 50, 51, 41))

        self.pButton_subtract = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_subtract.setGeometry(QtCore.QRect(210, 100, 51, 41))

        self.pButton_multiplication = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_multiplication.setGeometry(QtCore.QRect(210, 150, 51, 41))

        self.pButton_divide = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_divide.setGeometry(QtCore.QRect(210, 200, 51, 41))

        self.pButton_equal = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_equal.setGeometry(QtCore.QRect(270, 150, 51, 91))

        self.pButton_ac = QtWidgets.QPushButton(self.centralwidget)
        self.pButton_ac.setGeometry(QtCore.QRect(270, 50, 51, 91))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.pButton_ac.setFont(font)
        self.pButton_ac.setDefault(True)


        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 330, 27))
        self.menuMain = QtWidgets.QMenu(self.menubar)
        MainWindow.setMenuBar(self.menubar)
        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionAbout = QtWidgets.QAction(MainWindow)
        self.menuMain.addAction(self.actionExit)
        self.menuMain.addAction(self.actionAbout)
        self.menubar.addAction(self.menuMain.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Simple Calculator"))
        MainWindow.setToolTip(_translate("MainWindow", "Simple Calculator"))
        self.pButton_0.setToolTip(_translate("MainWindow", "0"))
        self.pButton_0.setText(_translate("MainWindow", "0"))
        self.pButton_00.setToolTip(_translate("MainWindow", "00"))
        self.pButton_00.setText(_translate("MainWindow", "00"))
        self.pButton_dot.setToolTip(_translate("MainWindow", "."))
        self.pButton_dot.setText(_translate("MainWindow", "."))
        self.pButton_1.setToolTip(_translate("MainWindow", "1"))
        self.pButton_1.setText(_translate("MainWindow", "1"))
        self.pButton_2.setToolTip(_translate("MainWindow", "2"))
        self.pButton_2.setText(_translate("MainWindow", "2"))
        self.pButton_3.setToolTip(_translate("MainWindow", "3"))
        self.pButton_3.setText(_translate("MainWindow", "3"))
        self.pButton_4.setToolTip(_translate("MainWindow", "4"))
        self.pButton_4.setText(_translate("MainWindow", "4"))
        self.pButton_5.setToolTip(_translate("MainWindow", "5"))
        self.pButton_5.setText(_translate("MainWindow", "5"))
        self.pButton_6.setToolTip(_translate("MainWindow", "6"))
        self.pButton_6.setText(_translate("MainWindow", "6"))
        self.pButton_7.setToolTip(_translate("MainWindow", "7"))
        self.pButton_7.setText(_translate("MainWindow", "7"))
        self.pButton_8.setToolTip(_translate("MainWindow", "8"))
        self.pButton_8.setText(_translate("MainWindow", "8"))
        self.pButton_9.setToolTip(_translate("MainWindow", "9"))
        self.pButton_9.setText(_translate("MainWindow", "9"))
        self.pButton_add.setToolTip(_translate("MainWindow", "+"))
        self.pButton_add.setText(_translate("MainWindow", "+"))
        self.pButton_subtract.setToolTip(_translate("MainWindow", "-"))
        self.pButton_subtract.setText(_translate("MainWindow", "-"))
        self.pButton_multiplication.setToolTip(_translate("MainWindow", "\N{MULTIPLICATION SIGN}"))
        self.pButton_multiplication.setText(_translate("MainWindow", "\N{MULTIPLICATION SIGN}"))
        self.pButton_divide.setToolTip(_translate("MainWindow", "\N{DIVISION SIGN}"))
        self.pButton_divide.setText(_translate("MainWindow", "\N{DIVISION SIGN}"))
        self.pButton_equal.setToolTip(_translate("MainWindow", "="))
        self.pButton_equal.setText(_translate("MainWindow", "="))
        self.pButton_ac.setToolTip(_translate("MainWindow", "AC"))
        self.pButton_ac.setText(_translate("MainWindow", "AC"))
        self.lineEdit_display.setToolTip(_translate("MainWindow", "Display"))
        self.lineEdit_display.setText(_translate("MainWindow", "0"))
        self.menuMain.setTitle(_translate("MainWindow", "Mai&n"))
        self.actionExit.setText(_translate("MainWindow", "&Exit"))
        self.actionAbout.setText(_translate("MainWindow", "&About"))

    def keyPressEvent(self, e):
        print(e.key())

if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()

    MainWindow.setFocus() #TRYING TO SET FOCUS FOR keyPressEvent

    sys.exit(app.exec_())

Sir, I couldn't find specifically what was the error in your syntax, so I edited your code to keep as much similar to yours as possible.先生,我找不到你的语法具体是什么错误,所以我编辑了你的代码以尽可能地与你的代码相似。

Here is your code working with some modifications, see if it would work for you.这是您的代码进行了一些修改,看看它是否适合您。

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

from PyQt5.QtWidgets import QAction
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QMenu
from PyQt5.QtWidgets import QMenuBar
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QWidget


class Ui_MainWindow(QMainWindow):

    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        # self.setupUi()

    def setupUi(self):
        self.setMinimumSize(QtCore.QSize(330, 280))
        self.setMaximumSize(QtCore.QSize(330, 280))

        self.centralwidget = QWidget()


        self.lineEdit_display = QLineEdit(self.centralwidget)
        self.lineEdit_display.setGeometry(QtCore.QRect(10, 0, 311, 41))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.lineEdit_display.setFont(font)
        self.lineEdit_display.setMaxLength(15)
        self.lineEdit_display.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
        self.lineEdit_display.setReadOnly(True)


        self.pButton_0 = QPushButton(self.centralwidget)
        self.pButton_0.setGeometry(QtCore.QRect(10, 200, 51, 41))
        self.pButton_0.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))

        self.pButton_00 = QPushButton(self.centralwidget)
        self.pButton_00.setGeometry(QtCore.QRect(70, 200, 51, 41))

        self.pButton_dot = QPushButton(self.centralwidget)
        self.pButton_dot.setGeometry(QtCore.QRect(130, 200, 51, 41))

        self.pButton_1 = QPushButton(self.centralwidget)
        self.pButton_1.setGeometry(QtCore.QRect(10, 150, 51, 41))

        self.pButton_2 = QPushButton(self.centralwidget)
        self.pButton_2.setGeometry(QtCore.QRect(70, 150, 51, 41))

        self.pButton_3 = QPushButton(self.centralwidget)
        self.pButton_3.setGeometry(QtCore.QRect(130, 150, 51, 41))

        self.pButton_4 = QPushButton(self.centralwidget)
        self.pButton_4.setGeometry(QtCore.QRect(10, 100, 51, 41))

        self.pButton_5 = QPushButton(self.centralwidget)
        self.pButton_5.setGeometry(QtCore.QRect(70, 100, 51, 41))

        self.pButton_6 = QPushButton(self.centralwidget)
        self.pButton_6.setGeometry(QtCore.QRect(130, 100, 51, 41))

        self.pButton_7 = QPushButton(self.centralwidget)
        self.pButton_7.setGeometry(QtCore.QRect(10, 50, 51, 41))

        self.pButton_8 = QPushButton(self.centralwidget)
        self.pButton_8.setGeometry(QtCore.QRect(70, 50, 51, 41))

        self.pButton_9 = QPushButton(self.centralwidget)
        self.pButton_9.setGeometry(QtCore.QRect(130, 50, 51, 41))

        self.pButton_add = QPushButton(self.centralwidget)
        self.pButton_add.setGeometry(QtCore.QRect(210, 50, 51, 41))

        self.pButton_subtract = QPushButton(self.centralwidget)
        self.pButton_subtract.setGeometry(QtCore.QRect(210, 100, 51, 41))

        self.pButton_multiplication = QPushButton(self.centralwidget)
        self.pButton_multiplication.setGeometry(QtCore.QRect(210, 150, 51, 41))

        self.pButton_divide = QPushButton(self.centralwidget)
        self.pButton_divide.setGeometry(QtCore.QRect(210, 200, 51, 41))

        self.pButton_equal = QPushButton(self.centralwidget)
        self.pButton_equal.setGeometry(QtCore.QRect(270, 150, 51, 91))

        self.pButton_ac = QPushButton(self.centralwidget)
        self.pButton_ac.setGeometry(QtCore.QRect(270, 50, 51, 91))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.pButton_ac.setFont(font)
        self.pButton_ac.setDefault(True)

        self.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 330, 27))
        self.menuMain = QMenu(self.menubar)
        self.setMenuBar(self.menubar)
        self.actionExit = QAction(self)
        self.actionAbout = QAction(self)
        self.menuMain.addAction(self.actionExit)
        self.menuMain.addAction(self.actionAbout)
        self.menubar.addAction(self.menuMain.menuAction())

        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "Simple Calculator"))
        self.setToolTip(_translate("MainWindow", "Simple Calculator"))
        self.pButton_0.setToolTip(_translate("MainWindow", "0"))
        self.pButton_0.setText(_translate("MainWindow", "0"))
        self.pButton_00.setToolTip(_translate("MainWindow", "00"))
        self.pButton_00.setText(_translate("MainWindow", "00"))
        self.pButton_dot.setToolTip(_translate("MainWindow", "."))
        self.pButton_dot.setText(_translate("MainWindow", "."))
        self.pButton_1.setToolTip(_translate("MainWindow", "1"))
        self.pButton_1.setText(_translate("MainWindow", "1"))
        self.pButton_2.setToolTip(_translate("MainWindow", "2"))
        self.pButton_2.setText(_translate("MainWindow", "2"))
        self.pButton_3.setToolTip(_translate("MainWindow", "3"))
        self.pButton_3.setText(_translate("MainWindow", "3"))
        self.pButton_4.setToolTip(_translate("MainWindow", "4"))
        self.pButton_4.setText(_translate("MainWindow", "4"))
        self.pButton_5.setToolTip(_translate("MainWindow", "5"))
        self.pButton_5.setText(_translate("MainWindow", "5"))
        self.pButton_6.setToolTip(_translate("MainWindow", "6"))
        self.pButton_6.setText(_translate("MainWindow", "6"))
        self.pButton_7.setToolTip(_translate("MainWindow", "7"))
        self.pButton_7.setText(_translate("MainWindow", "7"))
        self.pButton_8.setToolTip(_translate("MainWindow", "8"))
        self.pButton_8.setText(_translate("MainWindow", "8"))
        self.pButton_9.setToolTip(_translate("MainWindow", "9"))
        self.pButton_9.setText(_translate("MainWindow", "9"))
        self.pButton_add.setToolTip(_translate("MainWindow", "+"))
        self.pButton_add.setText(_translate("MainWindow", "+"))
        self.pButton_subtract.setToolTip(_translate("MainWindow", "-"))
        self.pButton_subtract.setText(_translate("MainWindow", "-"))
        self.pButton_multiplication.setToolTip(_translate("MainWindow", "\N{MULTIPLICATION SIGN}"))
        self.pButton_multiplication.setText(_translate("MainWindow", "\N{MULTIPLICATION SIGN}"))
        self.pButton_divide.setToolTip(_translate("MainWindow", "\N{DIVISION SIGN}"))
        self.pButton_divide.setText(_translate("MainWindow", "\N{DIVISION SIGN}"))
        self.pButton_equal.setToolTip(_translate("MainWindow", "="))
        self.pButton_equal.setText(_translate("MainWindow", "="))
        self.pButton_ac.setToolTip(_translate("MainWindow", "AC"))
        self.pButton_ac.setText(_translate("MainWindow", "AC"))
        self.lineEdit_display.setToolTip(_translate("MainWindow", "Display"))
        self.lineEdit_display.setText(_translate("MainWindow", "0"))
        self.menuMain.setTitle(_translate("MainWindow", "Mai&n"))
        self.actionExit.setText(_translate("MainWindow", "&Exit"))
        self.actionAbout.setText(_translate("MainWindow", "&About"))

    def keyPressEvent(self, e):
        print(e.key())

if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    ui = Ui_MainWindow()
    ui.setupUi()
    ui.show()

    sys.exit(app.exec_())

Hope it works ^^希望它有效^^

It looks like you need to connect each widget with an event.看起来您需要将每个小部件与一个事件连接起来。 GUIs are event-driven programming. GUI 是事件驱动的编程。 As you've seen, they just sit there looking at you until the user takes some action, and it is your (the programmer's) responsibility to define what happens for each action.正如您所看到的,他们只是坐在那里看着您,直到用户采取某些行动为止,您(程序员)有责任定义每个行动会发生什么。

For example, you have buttons for your calculator.例如,您的计算器有按钮。 I assume when you press a number button you want that number to show up in a text box representing the display.我假设当您按下数字按钮时,您希望该数字显示在代表显示器的文本框中。 If so then you need to handle the "clicked" event.如果是这样,那么您需要处理“clicked”事件。 Something similar to类似的东西

 self.pButton_9.clicked.connect(self.click_9) # connects button to action by defining a callback - an action to handle the event.

def click_9(self):
    self.lineEdit_display.text += '9 '

One of the best intro tutorials I've seen is Here .我见过的最好的介绍教程之一是Here I usually have all my Python classes go through it to start learning GUI programming.我通常让我所有的 Python 课程都通过它来开始学习 GUI 编程。

I had this problem too.我也有这个问题。 use this code in setupUI function:在 setupUI 函数中使用此代码:

MainWindow.keyPressEvent = self.keyPressEvent

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM