pyqt5中主窗口关闭时如何关闭其他窗口

Ton*_*osi 5 python pyqt5

我想在主窗口关闭时关闭主窗口打开的所有其他窗口。

请在下面找到最小值。我正在测试的代码:

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget

import sys


class AnotherWindow(QWidget):
    """
    This "window" is a QWidget. If it has no parent, it
    will appear as a free-floating window as we want.
    """
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.label = QLabel("Another Window")
        layout.addWidget(self.label)
        self.setLayout(layout)


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)
        self.setCentralWidget(self.button)

    def show_new_window(self, checked):
        self.w = AnotherWindow()
        self.w.show()

    def close_another_window(self):
        if self.w:
            self.w.close()


app = QApplication(sys.argv)

w = MainWindow()
app.aboutToQuit.connect(w.close_another_window)
w.show()
app.exec()
Run Code Online (Sandbox Code Playgroud)

如上所示,我尝试使用aboutToQuit的选项QApplication,但只有当另一个窗口也关闭时才会调用它。

我想在主窗口关闭时自动关闭另一个窗口。

mus*_*nte 9

实施closeEvent

class MainWindow(QMainWindow):
    w = None
    # ...
    def closeEvent(self, event):
        if self.w:
            self.w.close()
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以使用它QApplication.closeAllWindows()来关闭任何顶级窗口,即使没有任何直接引用,但如果其中任何一个窗口忽略该closeEvent()函数,该函数将停止尝试关闭其余窗口。

为了避免这种情况,您可以使用 ; 循环所有窗口QApplication.topLevelWidgets()。忽略 的窗口closeEvent仍会保持打开状态,但所有其他窗口都将关闭:

    def closeEvent(self, event):
        for window in QApplication.topLevelWidgets():
            window.close()
Run Code Online (Sandbox Code Playgroud)