Python 关闭事件不称为键盘事件和MessageBox
我使用QT Designer进行GUI编程,并希望使用ESC键禁用关闭事件。用户可以使用顶部的X关闭应用程序,但不能使用任何键 功能关闭事件(self,event)不工作Python 关闭事件不称为键盘事件和MessageBox,python,pyqt,pyqt5,qt-designer,qdialog,Python,Pyqt,Pyqt5,Qt Designer,Qdialog,我使用QT Designer进行GUI编程,并希望使用ESC键禁用关闭事件。用户可以使用顶部的X关闭应用程序,但不能使用任何键 功能关闭事件(self,event)不工作 def closeEvent(self, event): close = QMessageBox() close.setText("You sure?") close.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel) close =
def closeEvent(self, event):
close = QMessageBox()
close.setText("You sure?")
close.setStandardButtons(QMessageBox.Yes | QMessageBox.Cancel)
close = close.exec()
if close == QMessageBox.Yes:
event.accept()
else:
event.ignore()
该函数位于我的主类上:类Ui\u工具(对象)
这是我的主要职责:
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Tool = QtWidgets.QDialog()
ui = Ui_Tool()
ui.setupUi(Tool)
Tool.show()
sys.exit(app.exec_())
我做错了什么
我添加了以下类:
class Logic(QMainWindow, Ui_Tool):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
def closeEvent(self, event):
answer = QtWidgets.QMessageBox.question(
self,
'Are you sure you want to quit ?',
'Task is in progress !',
QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if answer == QtWidgets.QMessageBox.Yes:
event.accept()
else:
event.ignore()
如果进行了审查:
逃生钥匙
如果用户在对话框中按Esc键,则QDialog::reject()将被删除
打电话。这将导致窗口关闭:无法启动关闭事件
忽略
因此,有两种可能的解决方案:
从PyQt5导入QtCore、QtGui、qtwidget
类Ui_LabelTool(对象):
def设置UI(自身、工具):
Tool.setObjectName(“工具”)
工具。调整大小(650569)
工具设置最小尺寸(QtCore.QSize(650569))
工具设置最大尺寸(QtCore.QSize(650569))
Tool.setAutoFillBackground(假)
工具设置已启用(错误)
# ....
类LabelTool(qtwidts.QDialog,Ui_LabelTool):
def uuu init uuu(self,parent=None):
超级(LabelTool,self)。\uuuu初始化(父级)
self.setupUi(self)
def由用户(自身)验证:
答案=qtwidts.QMessageBox.question(
自己
“你确定要退出吗?”,
“任务正在进行中!”,
qtwidts.QMessageBox.Yes,
qtwidts.QMessageBox.No,
)
返回答案==QtWidgets.QMessageBox.Yes
def按键事件(自身,事件):
如果event.key()==QtCore.Qt.key\u转义:
self.close()
其他:
超级(LabelTool,自我)。按键事件(事件)
def关闭事件(自身、事件):
如果self.verify\u by\u user():
event.accept()
其他:
event.ignore()
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=LabelTool()
w、 show()
sys.exit(app.exec_())
二,
从PyQt5导入QtCore、QtGui、qtwidget
类Ui_LabelTool(对象):
def设置UI(自身、工具):
Tool.setObjectName(“工具”)
工具。调整大小(650569)
工具设置最小尺寸(QtCore.QSize(650569))
工具设置最大尺寸(QtCore.QSize(650569))
Tool.setAutoFillBackground(假)
工具设置已启用(错误)
# ....
类LabelTool(qtwidts.QDialog,Ui_LabelTool):
def uuu init uuu(self,parent=None):
超级(LabelTool,self)。\uuuu初始化(父级)
self.setupUi(self)
def由用户(自身)验证:
答案=qtwidts.QMessageBox.question(
自己
“你确定要退出吗?”,
“任务正在进行中!”,
qtwidts.QMessageBox.Yes,
qtwidts.QMessageBox.No,
)
返回答案==QtWidgets.QMessageBox.Yes
def拒绝(自我):
如果self.verify\u by\u user():
super(LabelTool,self).reject()
def关闭事件(自身、事件):
如果self.verify\u by\u user():
event.accept()
其他:
event.ignore()
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=LabelTool()
w、 show()
sys.exit(app.exec_())
(1) 非常感谢。但是逻辑类的实现不起作用。我必须更改主函数的任何内容吗??你是说在类逻辑中??我这样做,但不起作用。。我读了你的解释如果名字=“\uuuuu main”:不,我什么也没改。这是我的问题,如果有什么改变吗?app=qtwidts.QApplication(sys.argv)LabelTool=qtwidts.QDialog()ui=ui\u LabelTool()ui.setupUi(LabelTool)#LabelTool.show()w=Logic()w.show()sys.exit(app.exec#())但不起作用..然后我出现了一个错误:没有定义名称“Tool”:在类UI\u Tool*中**function\u init\u self.setupUi(LabelTool)
class Logic(QMainWindow, Ui_Tool):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self, *args, **kwargs)
self.setupUi(self)
def closeEvent(self, event):
answer = QtWidgets.QMessageBox.question(
self,
'Are you sure you want to quit ?',
'Task is in progress !',
QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if answer == QtWidgets.QMessageBox.Yes:
event.accept()
else:
event.ignore()