popup closeEvent code with code from QtDesigner [duplicate]

一世执手 提交于 2021-01-29 09:02:22

问题


I'm trying to create a pop up message box when the "close" button is pressed. my code looks like as follow:


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_())

But when I run press the close button, "X", the popup window doesnt work.

The window just closes.

Do you guys know what can be wrong ?


回答1:


You've got yourself into one of the most common mistakes of PyQt: you're editing the file generated by the pyuic utility.
Those files are not intended for a starting point to begin your program with, but they always have to be used as imported modules. I suggest you to carefully read the documentation about using Designer.

Now, to the problem at hand: closeEvent() is a member of the QWidget class, and is called by the QWidget instance when it is going to be closed. In your case, it will never be called, since you've made it a member of the Ui_Form class.

First of all, rebuild the ui using pyuic. Then create a new script (which will be your main script of your program) and, following the third method specified in the designer documentation given above (the multiple inheritance approach), you create a subclass of QWidget for your widget, then finally override the closeEvent there:

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_())

Remember: never, never edit the files generated by pyuic.



来源:https://stackoverflow.com/questions/60576205/popup-closeevent-code-with-code-from-qtdesigner

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!