弹出关闭事件代码与来自QtDesigner的代码



我正试图在按下"关闭"按钮时创建一个弹出消息框。我的代码如下所示:


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox

class Ui_Form(object):
def __init__(self):
super().__init__()
self.stop_request_1 = False
self.stop_request_2 = False
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 180)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
Form.setSizePolicy(sizePolicy)
Form.setMinimumSize(QtCore.QSize(400, 180))
Form.setMaximumSize(QtCore.QSize(400, 180))
self.btn_1 = QtWidgets.QPushButton(Form)
self.btn_1.setGeometry(QtCore.QRect(30, 60, 86, 26))
self.btn_1.setIconSize(QtCore.QSize(20, 20))
self.btn_1.setObjectName("btn_1")
self.btn_2 = QtWidgets.QPushButton(Form)
self.btn_2.setGeometry(QtCore.QRect(250, 60, 86, 26))
self.btn_2.setObjectName("btn_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.btn_1.setText(_translate("Form", "btn 1"))
self.btn_2.setText(_translate("Form", "btn 2"))
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Window Close', 'Are you sure you want to close the window?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
print('Window closed')
else:
event.ignore()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())

但当我跑步时,按下关闭按钮"X",弹出窗口就不起作用了。

窗户刚好关上。

你们知道会出什么问题吗?

PyQt最常见的错误之一是:您正在编辑pyuic实用程序生成的文件
这些文件不是用来启动程序的起点,但它们必须始终用作导入的模块。我建议您仔细阅读有关使用Designer的文档。

现在,针对手头的问题:closeEvent()是QWidget类的成员,当它将被关闭时,它会被QWidget实例调用。在您的情况下,它将永远不会被调用,因为您已经使它成为Ui_Form类的成员。

首先,使用pyuic重建ui。然后创建一个新的脚本(这将是您程序的主脚本(,按照上面给出的设计器文档中指定的第三种方法(多重继承方法(,为您的小部件创建QWidget的子类,然后最终覆盖那里的closeEvent:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from ui_form import Ui_Form
class MyWidget(QtWidgets.QWidget, Ui_Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setupUi(self)
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Window Close', 
'Are you sure you want to close the window?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
print('Window closed')
else:
event.ignore()

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
myWidget = MyWidget()
myWidget.show()
sys.exit(app.exec_())

请记住:never,never编辑pyuic生成的文件。

最新更新