雖然我意識到其他人也提出了類似的問題,但我的有限知識似乎導致了這個難題的缺失。我將進一步解釋爲什麼這個問題在下面之前沒有得到解答。如何在PyQT5中爲QPlainTextEdit(或任何其他組件)實現關鍵監聽器
這裏是我與(由Qt Creator中產生的)工作的代碼
from PyQt5 import QtCore, QtGui, QtWidgets, Qt
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1000, 606)
MainWindow.setMinimumSize(QtCore.QSize(1000, 600))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 991, 561))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.gridLayoutWidget = QtWidgets.QWidget(self.tab)
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 991, 491))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
spacerItem = QtWidgets.QSpacerItem(200, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 3, 2, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(200, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem1, 3, 0, 1, 1)
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.gridLayoutWidget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.tbxUser = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.tbxUser.setAlignment(QtCore.Qt.AlignCenter)
self.tbxUser.setObjectName("tbxUser")
self.verticalLayout.addWidget(self.tbxUser)
self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.tbxPass = QtWidgets.QLineEdit(self.gridLayoutWidget)
self.tbxPass.setEchoMode(QtWidgets.QLineEdit.Password)
self.tbxPass.setAlignment(QtCore.Qt.AlignCenter)
self.tbxPass.setObjectName("tbxPass")
self.verticalLayout.addWidget(self.tbxPass)
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.btnLogin = QtWidgets.QPushButton(self.gridLayoutWidget)
self.btnLogin.setObjectName("btnLogin")
self.verticalLayout_4.addWidget(self.btnLogin)
self.chxLogin = QtWidgets.QCheckBox(self.gridLayoutWidget)
self.chxLogin.setLayoutDirection(QtCore.Qt.RightToLeft)
self.chxLogin.setChecked(True)
self.chxLogin.setObjectName("chxLogin")
self.verticalLayout_4.addWidget(self.chxLogin)
self.verticalLayout.addLayout(self.verticalLayout_4)
self.lstEntries = QtWidgets.QListWidget(self.gridLayoutWidget)
self.lstEntries.setObjectName("lstEntries")
self.verticalLayout.addWidget(self.lstEntries)
self.gridLayout.addLayout(self.verticalLayout, 3, 1, 1, 1)
self.tbxLoginStatus = QtWidgets.QTextEdit(self.tab)
self.tbxLoginStatus.setEnabled(False)
self.tbxLoginStatus.setGeometry(QtCore.QRect(0, 490, 991, 21))
self.tbxLoginStatus.setObjectName("tbxLoginStatus")
self.prgEntries = QtWidgets.QProgressBar(self.tab)
self.prgEntries.setGeometry(QtCore.QRect(0, 510, 991, 23))
self.prgEntries.setProperty("value", 0)
self.prgEntries.setObjectName("prgEntries")
self.tabWidget.addTab(self.tab, "")
self.tab_3 = QtWidgets.QWidget()
self.tab_3.setObjectName("tab_3")
self.frame = QtWidgets.QFrame(self.tab_3)
self.frame.setGeometry(QtCore.QRect(0, 0, 991, 541))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.lstSentences = QtWidgets.QListWidget(self.frame)
self.lstSentences.setGeometry(QtCore.QRect(0, 0, 221, 491))
self.lstSentences.setObjectName("lstSentences")
self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.frame)
self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(220, 0, 541, 491))
self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.tbxOriginal = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)
self.tbxOriginal.setEnabled(False)
self.tbxOriginal.setObjectName("tbxOriginal")
self.verticalLayout_3.addWidget(self.tbxOriginal)
self.tbxHtml = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)
self.tbxHtml.setEnabled(False)
self.tbxHtml.setObjectName("tbxHtml")
self.verticalLayout_3.addWidget(self.tbxHtml)
self.tbxPlain = QtWidgets.QPlainTextEdit(self.verticalLayoutWidget_3)
self.tbxPlain.setObjectName("tbxPlain")
self.verticalLayout_3.addWidget(self.tbxPlain)
self.btnSaveSentence = QtWidgets.QPushButton(self.verticalLayoutWidget_3)
self.btnSaveSentence.setObjectName("btnSaveSentence")
self.verticalLayout_3.addWidget(self.btnSaveSentence)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.tbxNotesLeft = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)
self.tbxNotesLeft.setObjectName("tbxNotesLeft")
self.horizontalLayout_2.addWidget(self.tbxNotesLeft)
self.tbxNotesRight = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)
self.tbxNotesRight.setObjectName("tbxNotesRight")
self.horizontalLayout_2.addWidget(self.tbxNotesRight)
self.verticalLayout_3.addLayout(self.horizontalLayout_2)
self.tbxComment = QtWidgets.QPlainTextEdit(self.verticalLayoutWidget_3)
self.tbxComment.setEnabled(False)
self.tbxComment.setObjectName("tbxComment")
self.verticalLayout_3.addWidget(self.tbxComment)
self.lstCorrections = QtWidgets.QListWidget(self.frame)
self.lstCorrections.setGeometry(QtCore.QRect(760, 0, 231, 491))
self.lstCorrections.setObjectName("lstCorrections")
self.prgStatus = QtWidgets.QProgressBar(self.frame)
self.prgStatus.setGeometry(QtCore.QRect(0, 510, 1001, 23))
self.prgStatus.setProperty("value", 0)
self.prgStatus.setObjectName("prgStatus")
self.tbxEditStatus = QtWidgets.QTextEdit(self.frame)
self.tbxEditStatus.setEnabled(False)
self.tbxEditStatus.setGeometry(QtCore.QRect(0, 490, 991, 21))
self.tbxEditStatus.setObjectName("tbxEditStatus")
self.tabWidget.addTab(self.tab_3, "")
self.widget = QtWidgets.QWidget()
self.widget.setObjectName("widget")
self.gridLayoutWidget_2 = QtWidgets.QWidget(self.widget)
self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 991, 541))
self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2")
self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setObjectName("gridLayout_2")
spacerItem2 = QtWidgets.QSpacerItem(100, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem2, 0, 0, 1, 1)
spacerItem3 = QtWidgets.QSpacerItem(100, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_2.addItem(spacerItem3, 0, 2, 1, 1)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget_2)
self.label_3.setObjectName("label_3")
self.verticalLayout_2.addWidget(self.label_3)
self.tbxTitle = QtWidgets.QLineEdit(self.gridLayoutWidget_2)
self.tbxTitle.setObjectName("tbxTitle")
self.verticalLayout_2.addWidget(self.tbxTitle)
self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget_2)
self.label_4.setObjectName("label_4")
self.verticalLayout_2.addWidget(self.label_4)
self.tbxBody = QtWidgets.QPlainTextEdit(self.gridLayoutWidget_2)
self.tbxBody.setObjectName("tbxBody")
self.verticalLayout_2.addWidget(self.tbxBody)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.btnPublish = QtWidgets.QPushButton(self.gridLayoutWidget_2)
self.btnPublish.setObjectName("btnPublish")
self.horizontalLayout.addWidget(self.btnPublish)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.gridLayout_2.addLayout(self.verticalLayout_2, 0, 1, 1, 1)
self.tabWidget.addTab(self.widget, "")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 17))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actLogin = QtWidgets.QAction(MainWindow)
self.actLogin.setCheckable(True)
self.actLogin.setObjectName("actLogin")
self.menu.addAction(self.actLogin)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)#*
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Lang-8 小幫手"))
self.label.setText(
_translate("MainWindow", "<html><head/><body><p align=\"center\">E-mail 信箱</p></body></html>"))
self.label_2.setText(
_translate("MainWindow", "<html><head/><body><p align=\"center\">密碼</p></body></html>"))
self.btnLogin.setText(_translate("MainWindow", "登入"))
self.chxLogin.setText(_translate("MainWindow", "維持我的登入狀態"))
self.tbxLoginStatus.setHtml(_translate("MainWindow",
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'PMingLiU\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">No User Logged In</p></body></html>"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "登入"))
self.btnSaveSentence.setText(_translate("MainWindow", "儲存"))
self.tbxEditStatus.setHtml(_translate("MainWindow",
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'PMingLiU\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">-</p></body></html>"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "進行修改"))
self.label_3.setText(
_translate("MainWindow", "<html><head/><body><p align=\"center\">標題</p></body></html>"))
self.label_4.setText(
_translate("MainWindow", "<html><head/><body><p align=\"center\">內容</p></body></html>"))
self.btnPublish.setText(_translate("MainWindow", "發表"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.widget), _translate("MainWindow", "輸出"))
self.menu.setTitle(_translate("MainWindow", "檔案"))
self.actLogin.setText(_translate("MainWindow", "Login"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
首先,所有我已經找到了這個問題的答案似乎是舊的,並專門針對QT4。
他們沒有爲我工作,但我也不太清楚實現它們的上下文是什麼,所以我也不確定問題在於它在QT5中是不同的還是它是上下文的東西(可能都是)。
下面是一個例子:
How does the keyPressEvent method work in this program?
# A key has been pressed!
def keyPressEvent(self, event):
# Did the user press the Escape key?
if event.key() == QtCore.Qt.Key_Escape: # QtCore.Qt.Key_Escape is a value that equates to what the operating system passes to python from the keyboard when the escape key is pressed.
# Yes: Close the window
self.close()
# No: Do nothing.
我已經嘗試使用這一解決方案通過簡單地複製並粘貼到我的Ui_MainWindow類,但沒有任何反應。
這是正確的代碼?如果是這樣,我該如何具體實施?也就是說,我把它放在哪裏?
我完全困惑和迷失。
感謝,
雖然它是爲PyQt4編寫的,[這個問題](https://stackoverflow.com/q/18417384/984421)本來可以解釋如何解決這個問題。唯一的區別是你需要使用'QtWidgets'而不是'QtGui'。您也可以在PyQt5文檔中閱讀[使用Qt Designer](http://pyqt.sourceforge.net/Docs/PyQt5/designer.html)。 – ekhumoro