[英]How to implement a key listener in PyQT5 for a QPlainTextEdit (or any other component)
雖然我意識到其他人已經問過類似的問題,但我有限的知識似乎導致了這個難題的缺失部分。 我將在下面進一步解釋為什么這個問題之前沒有得到回答。
這是我正在使用的代碼(由 QT 創建者生成)
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 中不同還是上下文的東西(可能兩者都有)。
下面是一個例子:
# 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 類中來實現此解決方案,但沒有任何反應。
這是正確的代碼嗎? 如果是這樣,我該如何具體實施? 即,我把它放在哪里?
我完全困惑和迷失了。
謝謝,
Qt Designer 提供了一種創建 GUI 的簡單方法,但它只實現了設計而不是邏輯,您要做的任務是邏輯的一部分。 為此,建議創建一個使用以前設計的新類。
為此,您必須創建一個名為 main.py 的新文件,該文件必須與 Qt Designer 生成的文件位於同一文件夾中。 對於 Qt Designer 生成的文件,我將其命名為 design.py:
.
├── design.py
└── main.py
此類繼承自您用作模板的窗口:QMainWindow 和生成的設計,您必須調用 setupUi() 來填充小部件。
from PyQt5 import QtCore, QtGui, QtWidgets
from design import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.close()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.