Событие закрытия MainWindow не закрывает QDialog должным образом

У меня есть MainWindow, которое открывает диалоговое окно. Когда я закрываю MainWindow, мне нужно также закрыть диалоговое окно, но самое главное, мне нужно, чтобы оно выполняло closeEvent в диалоговом окне, потому что в моем диалоговом окне мне нужно сделать некоторые вещи перед закрытием. Возможно ли порожденному диалогу из главного окна отправить событие закрытия в диалог, чтобы диалог мог выполнить свой код closeEvent?

Ниже приведено упрощенное MainWindow, которое порождает упрощенный диалог:

# testCloseEventMain.py

from testCloseEventDialog import TestDialog
from PyQt5 import QtCore, QtGui, QtWidgets

class newDialog(QtWidgets.QDialog, TestDialog):
    def __init__(self):
        QtWidgets.QDialog.__init__(self)
        self.setupUi(self)

class TestMain(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(300, 100)

        self.centralwidget = QtWidgets.QWidget(MainWindow)

        self.btnOpenDialog = QtWidgets.QPushButton()
        self.btnClose = QtWidgets.QPushButton()

        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.addWidget(self.btnOpenDialog)
        self.verticalLayout.addWidget(self.btnClose)

        self.btnOpenDialog.clicked.connect(self.openDialog)
        self.btnClose.clicked.connect(self.closeBtnPushed)

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btnOpenDialog.setText(_translate("MainWindow", "Open Dialog"))
        self.btnClose.setText(_translate("MainWindow", "Close"))

    def openDialog(self):
        self.popNewDialog = newDialog()
        self.popNewDialog.show()

    def closeBtnPushed(self):
        print("close button pressed in main window")
        self.closeEvent()

    def closeEvent(self, event):
        print("executing closing event in main window")
        sys.exit()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = TestMain()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Ниже приведен упрощенный диалог:

# testCloseEventDialog.py

from PyQt5 import QtCore, QtGui, QtWidgets

class TestDialog(object):
    def setupUi(self, DialogTest):
        DialogTest.resize(200, 100)
        DialogTest.setWindowTitle("DialogTest")

        self.btnClose = QtWidgets.QPushButton()
        self.btnClose.setText("Close")
        self.btnClose.clicked.connect(self.exitWindow)

        self.verticalLayout = QtWidgets.QVBoxLayout(DialogTest)
        self.verticalLayout.addWidget(self.btnClose)

        QtCore.QMetaObject.connectSlotsByName(DialogTest)

    def exitWindow(self):
        print("close button pressed in test dialog window")
        self.close()

    def closeEvent(self, event):
        print("executing close event in test dialog window")
        self.exitWindow()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    DialogTest = QtWidgets.QWidget()
    ui = TestDialog()
    ui.setupUi(DialogTest)
    DialogTest.show()
    sys.exit(app.exec_())

Когда я нажимаю кнопку "x" или кнопку "Close" в MainWindow, я бы хотел, чтобы он выполнял код "closeEvent" в диалоге И MainWindow. В настоящее время код "closeEvent" никогда не выполняется в главном окне или диалоговом окне, когда в главном окне нажимается кнопка "x" или кнопка "Закрыть".

0 ответов

Другие вопросы по тегам