首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PyQT5中为QPlainTextEdit (或任何其他组件)实现密钥侦听器

如何在PyQT5中为QPlainTextEdit (或任何其他组件)实现密钥侦听器
EN

Stack Overflow用户
提问于 2017-10-12 19:08:41
回答 1查看 2.2K关注 0票数 2

虽然我意识到其他人也问过类似的问题,但我有限的知识似乎导致了这个谜题的缺失。我会进一步解释为何这个问题未获答覆。

下面是我正在使用的代码(由QT创建者生成)

代码语言:javascript
复制
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?

代码语言:javascript
复制
# 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类来实现这个解决方案,但是什么也没有发生。

这是正确的代码吗?如果是这样,我如何具体地实现它?呃,我把它放哪儿?

我完全迷茫迷茫了。

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 20:06:33

Qt提供了一个创建GUI的简单方法,但它只实现了设计而不是逻辑,您想要完成的任务是逻辑的一部分。为此,建议创建一个使用前面设计的新类。

为此,您必须创建一个名为main.py的新文件,该文件必须与Qt生成的文件位于同一个文件夹中。对于Qt设计器生成的文件,我将称之为design.py:

代码语言:javascript
复制
.
├── design.py
└── main.py

该类继承自用作模板的窗口: QMainWindow和生成的设计,必须调用setupUi()来填充小部件。

代码语言:javascript
复制
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_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46717186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档