Jak zavřete ostatní okna, když je zavřeno hlavní okno v pyqt5

0

Otázka

Chci, aby zavřete všechny ostatní okna otevírat hlavní okno, když je zavřeno hlavní okno.

Níže naleznete min. kód, který jsem testoval:

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

Jak je uvedeno výše, jsem se snažil pomocí aboutToQuit možnost QApplication, ale to dostane jen volal, když se další okno je také uzavřen.

Chci uzavřít další okno automaticky, když mainwindow je uzavřen.

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

Nejlepší odpověď

4

Provedení closeEvent:

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

Všimněte si, že můžete také použít QApplication.closeAllWindows() zavřete každém okně nejvyšší úrovně, a to i bez mít žádný přímý odkaz, ale pokud některý z těch windows ignoruje closeEvent() funkce zastaví se snaží uzavřít zbývající.

Aby se zabránilo, že můžete cyklus systému windows pomocí QApplication.topLevelWidgets(); windows ignorovat closeEvent bude stále držet, samy otevřít, ale všechny ostatní bude uzavřen:

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

Mohli byste zkusit použít signály:

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

Tento mechanismus umožňuje uzavřít další okno, a to i bez zavření hlavního okna.

(Já jsem použil signály pro jiné účely, doufám, že to funguje stejně)

2021-11-23 13:27:42

V jiných jazycích

Tato stránka je v jiných jazycích

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