PyQt5 keyPressEvent 不适用于终止 App Qt Designer
PyQt 5 keyPressEvent doesn`t work for terminating App Qt Designer
大家晚上好!
我刚开始在 Python 中使用 pyQt5 和 Qt Designer,所以在编写下面的示例时遇到了一些麻烦。无论应用程序内部的按钮等如何,问题都是关于使用 keyPressEvent 即通过 Esc 按钮终止应用程序。
有 2 个文件:一个由设计师生成,第二个 - keyPressEvent 所在的位置。
表单正在打开,但按 Esc 按钮没有任何反应。
期待您的光临! 谢谢。
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_())
必须在构造函数中使用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_())
大家晚上好! 我刚开始在 Python 中使用 pyQt5 和 Qt Designer,所以在编写下面的示例时遇到了一些麻烦。无论应用程序内部的按钮等如何,问题都是关于使用 keyPressEvent 即通过 Esc 按钮终止应用程序。 有 2 个文件:一个由设计师生成,第二个 - keyPressEvent 所在的位置。 表单正在打开,但按 Esc 按钮没有任何反应。 期待您的光临! 谢谢。
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_())
必须在构造函数中使用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_())