2017-02-14 91 views
0

祝大家晚上好! 我刚刚开始使用pyQt5在Python中的Qt设计师所以遇到了一些麻烦,同时编码下面的例子。无论关于App内部的按钮等,问题都是关于使用keyPressEvent,即用于通过Esc按钮终止App。 有2个文件:一个由设计师生成,第二个 - 其中keyPressEvent是。 窗体正在打开,但没有发生任何事情,它按Esc对接。 期待您的肝脏! 谢谢。PyQt 5 keyPressEvent不适用于终止应用Qt设计器

ui_main.py

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

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

回答

0

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

qApp.installEventFilter(self) 

然后,我们覆盖的方法:

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) 

完整代码:

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

谢谢大家帮忙的朋友,祝你好运:) – Michael

+0

@迈克尔如果我的回答可以帮助,将其标记为正确的请。 – eyllanesc

+0

没问题,完成 – Michael

相关问题