我在ui中使用pyQt Designer创建了一个代码并将其更改为py代码。
现在我想向我的这个添加一些 Keypress 事件,即如果我点击带有数字 3 的键盘键,我的标签上应该有文本 3 或者它只是打印“嗨”
我已经通过互联网检查了很多论坛,发现最好重新实现 keyPressEvent 以使用键盘事件。我尝试过,但是不知何故我无法使其在 pyQT 设计器生成的代码中工作。
下面是 pyQT 设计器生成的代码。我也将 keyPressEvent 重新实现的代码放入其中,但是它不起作用:
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 600)
MainWindow.setFocus()
def keyPressEvent(self, qKeyEvent):
print "hi"
print(qKeyEvent.key())
if qKeyEvent.key() == QtCore.Qt.Key_Return:
print('Enter pressed')
else:
super(Ui_MainWindow).keyPressEvent(qKeyEvent)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.horizontalLayoutWidget = QtGui.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(40, 10, 721, 80))
self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget"))
self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.textEdit = QtGui.QLabel(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(50, 110, 81, 41))
self.textEdit.setObjectName(_fromUtf8("textEdit"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(130, 260, 75, 23))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.textEdit.setText("I am a label")
self.pushButton.setText(_translate("MainWindow", "PushButton", None))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
我是这个论坛的新手,如果有人可以提供帮助会很有帮助。我知道这可以通过创建另一个继承 QMainWindow 的类来实现,但我想在相同的代码中执行此操作,即在 pyQT Designer 生成的代码块中。
另外请建议如果有任何方法可以在不重新实现 keypressEvent 的情况下做到这一点
谢谢
您的代码不起作用有两个原因。
第一个是您keyPressEvent在setupUi方法内部定义,因此它对类完全不可见。
其次是因为在代码中:
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
您正在创建 的实例QMainWindow,它使用自己的 实现keyPressEvent。您应该QMainWindow在那里创建一个子类并重新实现该方法。
打开设计器并创建主窗口。

.ui使用pyuic以下命令编译文件:
$pyuic4 mainwindow.ui -o ui_mainwindow.py
Run Code Online (Sandbox Code Playgroud)创建一个新的文件,你会写的子类QMainWindow,mymainwindow.py。不要修改ui_mainwindow.py。文件开头有一个很大的警告:
# 警告!在此文件中所做的所有更改都将丢失!
如果您不想在更改 UI 时丢失所有代码,请不要修改文件。
实现keyPressEvent在子类:
from PyQt4 import QtGui
# import the UI from the generated file
from ui_mainwindow import Ui_MainWindow
# it's not stricly necessary to subclass Ui_MainWindow.
class MyMainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
# if you didn't subclass Ui_MainWindow simply do:
# Ui_MainWindow().setupUi(self)
def keyPressEvent(self, event):
# implement the method here
self.label.setText(self.label.text() + 'a')
if __name__ == '__main__':
app = QtGui.QApplication([])
win = MyMainWindow()
win.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
a都会将一个添加到文本中。