2017-02-14 88 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

相關問題