Событие закрытия 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" или кнопка "Закрыть".