简体   繁体   中英

How to implement a key listener in PyQT5 for a QPlainTextEdit (or any other component)

While I realize others have asked similar questions, my limited knowledge seems to have resulted in a missing piece to this puzzle. I will further explain why this question hasn't been answered before below.

Here's the code I'm working with (generated by 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_())

First of all, all of the answers I've found for this question seem to be older, and specifically for QT4.

They haven't worked for me, but I'm also not quite sure what context to implement them in, so I'm also not sure if the problem is that it's different in QT5 or if it's the context thing (probably both).

Here's an example:

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.

I've tried implementing this solution by simply copy and pasting into my Ui_MainWindow class, but nothing happens.

Is this the right kind of code? If so, how do I implement it specifically? Ie., where do I put it?

I'm completely confused and lost.

Thanks,

Qt Designer provides a simple method to create a GUI, but it only implements the design and not the logic, the task you want to do is part of the logic. For this it is advisable to create a new class that uses the previous design.

To do this you must create a new file that will call you main.py which must be in the same folder as the file generated by Qt Designer. To the file generated by Qt Designer I will call it design.py:

.
├── design.py
└── main.py

This class inherits from the window that you used as a template: QMainWindow and the generated design, you must call setupUi() to fill the widgets.

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_())

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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