วิธีที่จะปิดหน้าต่างอื่นเมื่อตอนที่หน้าต่างหลักปิดอยู่ใน pyqt5

0

คำถาม

ฉันต้องการจะปิดทั้งหน้าต่างอื่นทั้งหมดที่เปิดอยู่โดยที่หน้าต่างหลักเมื่อตอนที่หน้าต่างหลักปิดไปแล้ว

ได้โปรดตามหาอยู่ด้านล่างมิน รหัสที่ฉันกำลังทดสอบ:

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

ที่แสดงอยู่เหนือฉันพยายามใช้ aboutToQuit ตัวเลือกของ QApplicationแต่มันนี้แต่จะโทรหาเมื่อตอนที่อีกหน้าต่างด้วมันปิดไปแล้ว

ฉันต้องการจะปิดในอีกหน้าต่าง automaticaly ตอนที่หน้าต่างหลักปิดไปแล้ว

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

คำตอบที่ดีที่สุด

4

ด้วยอะไรซักอย่าง closeEvent:

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

โปรดสังเกตว่าคุณยังสามารถใช้ QApplication.closeAllWindows() เพื่อปิด มี ระดับบนสุดหน้าต่างแม้ไม่มีดวงโดยตรงอ้างอิงแต่ถ้าเรื่องอะไรพวกนั้นหน้าต่างรายการที่ไม่ต้องสนใจคน closeEvent() ฟังก์ชันจะต้องหยุดพยายามที่จะปิดที่เหลืออยู่.

เพื่อหลีกเลี่ยงได้วังวนหน้าต่างทั้งหมดที่ใช้ QApplication.topLevelWidgets();องหน้าต่างไม่สนใจ closeEvent จะยังคงทำให้ตัวเองเปิดออกแต่ ทุก คนอื่นๆก็คงจะปิดแล้ว:

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

คุณอาจจะพยายามจะใช้สัญญาณ:

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

นี่กลไกของมันอนุญาตให้ทำการปิดหน้าต่างอื่ยังไม่มีการปิดหน้าต่างหลัก.

(ฉันเคยสัญญาณสำหรับอีกประสงค์หวังว่ามันจะได้ผลเช่นกัน)

2021-11-23 13:27:42

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่