Pyqt5'te ana pencere kapatıldığında diğer pencereler nasıl kapatılır

0

Soru

Ana pencere kapalıyken ana pencere tarafından açılan diğer tüm pencereleri kapatmak istiyorum.

Lütfen dakikanın altında bulun. test ettiğim kod:

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

Yukarıda gösterildiği gibi kullanmayı denedim aboutToQuit seçeneği QApplication ancak, yalnızca başka bir pencere de kapatıldığında çağrılır.

Ana pencere kapalıyken başka bir pencereyi otomatik olarak kapatmak istiyorum.

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

En iyi cevabı

4

UygulamakcloseEvent:

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

Ayrıca şunları da kullanabileceğinizi unutmayınQApplication.closeAllWindows() herhangi bir üst düzey pencereyi kapatmak için, herhangi bir doğrudan referansa sahip olmadan bile, ancak bu pencerelerden herhangi biri göz ardı ederse closeEvent() işlev, kalan kapatmaya çalışmayı durduracaktır.

Bunu önlemek için, tüm pencereleri kullanarak geçiş yapabilirsinizQApplication.topLevelWidgets(); windows yoksayılıyor closeEvent hala kendilerini açık tutacaklar, ama diğerleri kapalı olacak:

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

Sinyalleri kullanmayı deneyebilirsin.:

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

Bu mekanizma, ana pencereyi kapatmadan bile başka bir pencereyi kapatmanıza izin verir.

(Sinyalleri başka amaçlar için kullandım, umarım bu da işe yarar)

2021-11-23 13:27:42

Diğer dillerde

Bu sayfa diğer dillerde

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