Как закрыть все окна при закрытии одного?

Подскажите как закрыть все активные окна при закрытии MainWindow ?

import sys
from PyQt5 import QtWidgets

class Window1(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        label = QtWidgets.QLabel("Label 1")

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(label)
        self.setLayout(layout)

class Window2(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        label = QtWidgets.QLabel("Label 2")

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(label)
        self.setLayout(layout)

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        window1_button = QtWidgets.QPushButton("Window 1")
        window2_button = QtWidgets.QPushButton("Window 2")
        window_quit = QtWidgets.QPushButton("Close")

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(window1_button)
        layout.addWidget(window2_button)
        layout.addWidget(window_quit)

        self.setLayout(layout)

        window1_button.clicked.connect(self.open_window1)
        window2_button.clicked.connect(self.open_window2)
        window_quit.clicked.connect(self.quit)

    def open_window1(self):
        window = Window1()
        window.resize(300, 300)
        window.show()

    def open_window2(self):
        window = Window2()
        window.resize(300, 300)
        window.show()

    def quit(self):
        QtWidgets.qApp.quit()

if __name__ == '__main__'
    application = QtWidgets.QApplication([])

    window = MainWindow()
    window.resize(500, 500)
    window.show()

    sys.exit(application.exec_())

Ответы (1 шт):

Автор решения: S. Nick

При создании экземпляров дополнительных окон родитель должен быть MainWindow.

Но чтобы виджет стал окном при наличии родителя, установите флаг Qt.Window.

Попробуйте так:

import sys
from PyQt5 import QtWidgets, QtCore                                 # + QtCore


class Window1(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window1, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.Window)                        # +++ Qt.Window
        label = QtWidgets.QLabel("Label 1")
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(label)
        self.setLayout(layout)

class Window2(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window2, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.Window)                        # +++ Qt.Window
        label = QtWidgets.QLabel("Label 2")
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(label)
        self.setLayout(layout)

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__()

        window1_button = QtWidgets.QPushButton("Window 1")
        window2_button = QtWidgets.QPushButton("Window 2")

        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(window1_button)
        layout.addWidget(window2_button)

        window1_button.clicked.connect(self.open_window1)
        window2_button.clicked.connect(self.open_window2)

    def open_window1(self):
        self.window = Window1(self)                                            # +++ self
        self.window.resize(300, 300)
        self.window.show()

    def open_window2(self):
        window = Window2(self)                                                  # +++ self
        window.resize(300, 300)
        window.show()

if __name__ == '__main__':  
    application = QtWidgets.QApplication([])
    window = MainWindow()
    window.resize(500, 500)
    window.show()
    sys.exit(application.exec_())

введите сюда описание изображения

→ Ссылка