首页 > 解决方案 > 使用来自 QtDesigner 的代码弹出 closeEvent 代码

问题描述

当按下“关闭”按钮时,我正在尝试创建一个弹出消息框。我的代码如下所示:


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

窗口只是关闭。

你们知道有什么问题吗?

标签: pythonpyqt5qt-designer

解决方案


您陷入了 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_())

记住:永远,永远不要编辑 pyuic 生成的文件。


推荐阅读