如何在 PyQT5 中为 QPlainTextEdit(或任何其他组件)实现关键侦听器 [英] How to implement a key listener in PyQT5 for a QPlainTextEdit (or any other component)

查看:40
本文介绍了如何在 PyQT5 中为 QPlainTextEdit(或任何其他组件)实现关键侦听器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

虽然我意识到其他人也提出了类似的问题,但我有限的知识似乎导致了这个难题的缺失部分.我将在下面进一步解释为什么这个问题之前没有得到回答.

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

from PyQt5 import QtCore, QtGui, QtWidgets, Qt类 Ui_MainWindow(对象):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")间隔项 = QtWidgets.QSpacerItem(200, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout.addItem(spacerItem, 3, 2, 1, 1)intervalItem1 = 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("标签")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.horizo​​ntalLayout_2 = QtWidgets.QHBoxLayout()self.horizo​​ntalLayout_2.setObjectName("horizo​​ntalLayout_2")self.tbxNotesLeft = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)self.tbxNotesLeft.setObjectName("tbxNotesLeft")self.horizo​​ntalLayout_2.addWidget(self.tbxNotesLeft)self.tbxNotesRight = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)self.tbxNotesRight.setObjectName("tbxNotesRight")self.horizo​​ntalLayout_2.addWidget(self.tbxNotesRight)self.verticalLayout_3.addLayout(self.horizo​​ntalLayout_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")separatorItem2 = QtWidgets.QSpacerItem(100, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.gridLayout_2.addItem(spacerItem2, 0, 0, 1, 1)separatorItem3 = 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.horizo​​ntalLayout = QtWidgets.QHBoxLayout()self.horizo​​ntalLayout.setObjectName("horizo​​ntalLayout")self.btnPublish = QtWidgets.QPushButton(self.gridLayoutWidget_2)self.btnPublish.setObjectName("btnPublish")self.horizo​​ntalLayout.addWidget(self.btnPublish)self.verticalLayout_2.addLayout(self.horizo​​ntalLayout)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("菜单")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.translateMainWindow.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 { 空格:预包装;}\n""</style></head><body style=\" font-family:\'PMingLiU\';字体大小:9pt;字体粗细:400;字体样式:正常;\">\n""<p align=\"center\" style=\" margin-top:0px;边距底部:0px;左边距:0px;边距右:0px;-qt-block-indent:0;text-indent:0px;\">没有用户登录</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 { 空格:预包装;}\n""</style></head><body style=\" font-family:\'PMingLiU\';字体大小:9pt;字体粗细:400;字体样式:正常;\">\n""<p align=\"center\" style=\" margin-top:0px;边距底部:0px;左边距:0px;边距右: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"))如果 __name__ == "__main__":导入系统app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()ui.setupUi(主窗口)MainWindow.show()sys.exit(app.exec_())

首先,我为这个问题找到的所有答案似乎都比较老,尤其是针对 QT4.

它们对我不起作用,但我也不太确定在什么上下文中实现它们,所以我也不确定问题是 QT5 中的不同还是上下文的问题(可能是两个).

这是一个例子:

keyPressEvent 方法在这个程序中是如何工作的?

# 一个键被按下了!def keyPressEvent(self, event):# 用户是否按下了退出键?if event.key() == QtCore.Qt.Key_Escape: # QtCore.Qt.Key_Escape 是一个值,它等同于按下转义键时操作系统从键盘传递给 python 的内容.# 是:关闭窗口self.close()# 不:什么都不做.

我尝试通过简单地复制并粘贴到我的 Ui_MainWindow 类中来实现此解决方案,但没有任何反应.

这是正确的代码类型吗?如果是这样,我该如何具体实施?即,我把它放在哪里?

我完全糊涂了.

谢谢,

解决方案

Qt Designer 提供了一个简单的方法来创建 GUI,但它只实现了设计而不是逻辑,你要做的任务是逻辑的一部分.为此,建议创建一个使用以前设计的新类.

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

<预><代码>.├──设计.py└── main.py

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

from PyQt5 import QtCore, QtGui, QtWidgets从设计导入 Ui_MainWindow类 MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, *args, **kwargs):QtWidgets.QMainWindow.__init__(self, *args, **kwargs)self.setupUi(self)def keyPressEvent(self, event):如果 event.key() == QtCore.Qt.Key_Escape:self.close()如果 __name__ == "__main__":导入系统app = QtWidgets.QApplication(sys.argv)w = 主窗口()w.show()sys.exit(app.exec_())

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

这篇关于如何在 PyQT5 中为 QPlainTextEdit(或任何其他组件)实现关键侦听器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆