Comment fermer les autres fenêtres lorsque la fenêtre principale est fermée dans pyqt5

0

La question

Je veux fermer toutes les autres fenêtres ouvertes par la fenêtre principale lorsque la fenêtre principale est fermée.

Veuillez trouver ci-dessous le min. le code que j'ai été le tester:

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

Comme indiqué ci-dessus, j'ai essayé à l'aide de la aboutToQuit l'option de la QApplicationmais il ne s'appelle quand l'autre fenêtre est aussi fermé.

Je veux fermer la une autre fenêtre automatiquement lorsque le mainwindow est fermé.

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

La meilleure réponse

4

Mettre en œuvre les closeEvent:

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

Notez que vous pouvez également utiliser QApplication.closeAllWindows() pour fermer toutes les fenêtre de premier niveau, même sans avoir aucune référence directe, mais si l'une de ces fenêtres, ignore le closeEvent() la fonction va arrêter d'essayer de fermer le reste.

Pour éviter cela, vous pouvez faire défiler toutes les fenêtres à l'aide de QApplication.topLevelWidgets(); windows ignorant la closeEvent continueront à s'ouvrir, mais tous les autres seront fermés:

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

Vous pourriez essayer d'utiliser des signaux:

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

Ce mécanisme permet de fermer une fenêtre, même sans la fermeture de la fenêtre principale.

(J'ai utilisé des signaux à d'autres fins, espérons que cela fonctionne aussi bien)

2021-11-23 13:27:42

Dans d'autres langues

Cette page est dans d'autres langues

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