首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt 5 keyPressEvent不适用于终止App设计器

PyQt 5 keyPressEvent不适用于终止App设计器
EN

Stack Overflow用户
提问于 2017-02-14 22:07:05
回答 1查看 1.3K关注 0票数 2

大家晚上好!我刚刚开始在Python中使用pyQt5Qt Designer,所以在编写下面的示例时遇到了一些麻烦。无论应用程序内部的按钮等等,问题都是关于使用keyPressEvent,即用Esc按钮终止应用程序。有两个文件:一个由设计器生成,另一个由keyPressEvent生成。表单正在打开,但它没有发生任何事情,按下Esc对接。期待着你的胜利!谢谢。

ui_main.py

代码语言:javascript
复制
from PyQt5 import QtCore, QtWidgets
from PyQt5 import QtQuickWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        self.gridLayout = QtWidgets.QGridLayout(MainWindow)
        self.gridLayout.setObjectName("gridLayout")
        self.bigWindow = QtQuickWidgets.QQuickWidget(MainWindow)
        self.bigWindow.setResizeMode(QtQuickWidgets.QQuickWidget.SizeRootObjectToView)
        self.bigWindow.setObjectName("bigWindow")
        self.gridLayout.addWidget(self.bigWindow, 0, 0, 1, 1)
        self.dateTimeEdit = QtWidgets.QDateTimeEdit(MainWindow)
        self.dateTimeEdit.setObjectName("dateTimeEdit")
        self.gridLayout.addWidget(self.dateTimeEdit, 1, 0, 1, 1)
        self.progressBar = QtWidgets.QProgressBar(MainWindow)
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.gridLayout.addWidget(self.progressBar, 2, 0, 1, 1)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Dialog"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QDialog()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

py_main.py

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtCore import Qt
from ui_main import Ui_MainWindow


class MyMainWindow(QDialog, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.show()
        self.setupUi(self)


    def keyPressEvent(self, event):
            if event.key() == Qt.Key_Escape:
                self.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyMainWindow()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-15 00:58:53

必须在构造函数中使用eventFilter方法:

代码语言:javascript
复制
qApp.installEventFilter(self)

然后我们重写该方法:

代码语言:javascript
复制
def eventFilter(self, obj, event):
    if event.type() == QEvent.KeyPress:
        if event.key() == Qt.Key_Escape:
            self.close()
    return super(MyMainWindow, self).eventFilter(obj, event)

完整代码:

代码语言:javascript
复制
import sys
from PyQt5.QtWidgets import QDialog, QApplication, qApp
from PyQt5.QtCore import Qt, QEvent
from ui_main import Ui_MainWindow

class MyMainWindow(QDialog, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        qApp.installEventFilter(self)
        self.setupUi(self)
        self.show()

    def eventFilter(self, obj, event):
        if event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Escape:
                self.close()
        return super(MyMainWindow, self).eventFilter(obj, event)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyMainWindow()
    sys.exit(app.exec_())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42237147

复制
相关文章

相似问题

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