簡體   English   中英

如何在 PyQT5 中為 QPlainTextEdit(或任何其他組件)實現關鍵偵聽器

[英]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 中不同還是上下文的東西(可能兩者都有)。

下面是一個例子:

keyPressEvent 方法在這個程序中是如何工作的?

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM