使用 QtDesigner 中的代码弹出 closeEvent 代码

popup closeEvent code with code from QtDesigner

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


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",弹出窗口window不起作用。

window刚刚关门。

你们知道什么是错误的吗?

您陷入了 PyQt 最常见的错误之一:您正在编辑由 pyuic 实用程序生成的文件。
这些文件并非旨在作为开始您的程序的起点,但它们始终 必须用作导入模块。我建议你仔细阅读关于 using Designer.

的文档

现在,解决手头的问题:closeEvent()是QWidgetclass的成员,并且在QWidget实例被调用时被调用将被关闭。在您的情况下,它永远不会被调用,因为您已将其设为 Ui_Form class.

的成员

首先,使用 pyuic 重新 uild ui。 然后创建一个 new 脚本(这将是您程序的主脚本),然后按照上面给出的设计器文档中指定的第三种方法(多重继承方法)创建一个子class 的 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_())

记住:从不,从不编辑pyuic.

生成的文件