Ako uzavrieť iné okien, keď hlavné okno je zatvorené v pyqt5

0

Otázka

Chcem zatvoriť všetky ostatné okná otvoriť hlavné okno keď hlavné okno sa zavrie.

Nižšie nájdete min. kód že som bol testovanie:

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

Ako je uvedené vyššie som sa snažil pomocou aboutToQuit možnosť QApplication,, ale to len dostane nazývajú keď sa ďalšie okno, tiež je zatvorené.

Chcem zavrieť ďalšie okno automaticky, keď mainwindow je zatvorené.

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

Najlepšiu odpoveď

4

Realizovať closeEvent:

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

Všimnite si, že môžete použiť aj QApplication.closeAllWindows() zatvorte všetky najvyššej úrovni okno, aj bez toho, aby nejaký priamy odkaz, ale ak ktorýkoľvek z týchto windows ignoruje closeEvent() funkcia zastaví sa snaží ukončiť zostávajúce.

Ak sa tomu chcete vyhnúť, môžete cyklu všetkých okien pomocou QApplication.topLevelWidgets(); windows ignorovanie closeEvent bude mať stále sami otvoriť, ale všetko ostatné bude uzavreté:

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

Môžete skúsiť použiť 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 mechanizmus umožňuje uzavrieť ďalšie okno, dokonca aj bez uzavretia hlavného okna.

(Použil som signálov na iné účely, dúfam, že to funguje aj)

2021-11-23 13:27:42

V iných jazykoch

Táto stránka je v iných jazykoch

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