Cómo cerrar otras ventanas cuando la ventana principal se cierra en pyqt5

0

Pregunta

Quiero cerrar todas las demás ventanas abiertas por la ventana principal cuando la ventana principal está cerrada.

Por favor buscar debajo de la min. el código que se estaba probando:

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

Como se muestra arriba he intentado utilizar la aboutToQuit la opción de la QApplicationpero sólo se llama cuando la otra ventana también está cerrada.

Quiero cerrar la otra ventana automáticamente cuando la ventana principal está cerrada.

pyqt5 python
2021-11-23 13:23:26
2

Mejor respuesta

4

Implementar el closeEvent:

class MainWindow(QMainWindow):
    w = None
    # ...
    def closeEvent(self, event):
        if self.w:
            self.w.close()

Tenga en cuenta que también puede utilizar QApplication.closeAllWindows() para cerrar cualquier ventana de nivel superior, incluso sin tener ninguna referencia directa, pero si alguna de esas ventanas ignora la closeEvent() la función se deje de tratar a cerca de los restantes.

Para evitar esto, usted puede cambiar todas las ventanas de usar QApplication.topLevelWidgets(); windows ignorando la closeEvent todavía se mantienen abiertos, pero todos los otros serán cerrados:

    def closeEvent(self, event):
        for window in QApplication.topLevelWidgets():
            window.close()
2021-11-23 19:09:45
0

Usted podría tratar de utilizar las señales:

from PyQt5.QtCore import pyqtSignal

class AnotherWindow(QWidget, close_signal):
    """
    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__()
        self.close_signal = close_signal
        self.close_signal.connect(self.close_me)  # connect handler to signal
        layout = QVBoxLayout()
        self.label = QLabel("Another Window")
        layout.addWidget(self.label)
        self.setLayout(layout)
    
    def close_me(self):
        # handler for signal    
        self.close()


class MainWindow(QMainWindow):
    close_signal = pyqtSignal()

    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.close_signal)
        self.w.show()

    def close_another_window(self):
        self.close_signal.emit()  # fire signal to close other windows

Este mecanismo permite a cerca de una ventana a otra, incluso sin cerrar la ventana principal.

(I señales de uso para otros fines, espero que esto funcione así)

2021-11-23 13:27:42

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................