PyQT5 программа закрывается при нажатии Esc
Любая программа, созданная в Qt Designer и импортированная в код Python при нажатии Escape закрывается. Как убрать это?
Пример:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept)
self.buttonBox.rejected.connect(Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
QDialog Class
Класс QDialog является базовым классом диалоговых окон.
Escape Key
Если пользователь нажимает клавишу
Escв диалоговом окне, вызываетсяQDialog::reject(). Это приведет к закрытию окна: событие закрытия нельзя игнорировать.
https://doc.qt.io/qt-5/qdialog.html#escape-key
Update
Но вы можете при создании формы в QT Designer наследоваться от виджета отличного от QDialog, например QWidget
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(30, 140, 341, 32))
self.buttonBox = QtWidgets.QDialogButtonBox(Form)
self.buttonBox.setObjectName("buttonBox")
self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonCancel = QtWidgets.QPushButton("Cancel")
self.buttonOk = QtWidgets.QPushButton("Ok")
self.buttonBox.addButton(self.buttonCancel, QtWidgets.QDialogButtonBox.RejectRole)
self.buttonBox.addButton(self.buttonOk, QtWidgets.QDialogButtonBox.ActionRole)
self.buttonOk.clicked.connect(lambda : self.label.setText('Ok'))
self.buttonCancel.clicked.connect(lambda: self.label.setText('Cancel'))
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QWidget() # - QDialog() + QWidget
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
Автор решения: alepron
→ Ссылка
Вы можете переопределить обработку события нажатия клавиши ESC для QDialog, например, вот так:
def keyPressEvent(self, a0: QKeyEvent) -> None:
if a0.key() == Qt.Key_Escape:
return
else:
return super().keyPressEvent(a0)
