PyQt5 - 检测其他 Window 何时关闭

PyQt5 - Detecting When Other Window Closes

我正在使用 PyQt5,我需要让我的主 window 检测另一个 window 何时关闭。我在这里 读到,创建信号 class 作为中介应该可行。但是我还没有让我的例子起作用。

在我的示例中,单击按钮会打开一个 QWidget window。当 QWidget 关闭时,主要 window 应该从蓝色背景变为红色背景。但是,主要 window 使用下面的脚本仍然是蓝色的。

我做错了什么?

from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import QObject, pyqtSignal
import os, sys

class MySignal(QObject):
    signal = pyqtSignal()

class MyMainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        
        #Make mainwindow
        self.setGeometry(100,100,300,200)
        self.setStyleSheet('background-color: blue')
        
        # Make widget and button objects and set connection
        self.widget = MyWidget()        
        self.btn = QPushButton(self)
        self.btn.setText('Click')
        self.btn.move(175, 150)
        self.btn.setStyleSheet('background-color: white')
        self.btn.clicked.connect(self.widget.showWidget)
        
        # Make signal object and set connection
        self.mySignal = MySignal()
        self.mySignal.signal.connect(self.changeToRed)
        
        # Let's start
        self.show()
        
    def changeToRed(self):
        self.setStyleSheet('background-color: red')
        
    def closeEvent(self, event):
        os._exit(0)
        
class MyWidget(QWidget):
    def __init__(self):
        super().__init__() 
        self.setGeometry(500, 100, 200, 200)
        self.sig = MySignal()
        
    def showWidget(self):
        self.show()
        
    def closeEvent(self, event):
        self.sig.signal.emit()
        self.close()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyMainWindow()
    app.exec()```

您只需要在关闭事件和将主屏幕变红的函数之间添加连接即可:

self.widget.closeEvent = self.changeToRed

这一行应该在你的主Window class

更改您的 changeToRed 函数,使其也排除事件:

def changeToRed(self, e):

您的代码失败的原因是 MyMainWindow 中连接的信号对象与您在 MyWidget 中创建的信号对象不同,因此永远不会发出信号。这是一个以正常方式使用信号的修改解决方案:

from PyQt5.QtWidgets import QPushButton, QMainWindow, QWidget, QApplication
from PyQt5.QtCore import QObject, pyqtSignal
import os, sys

class MyMainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        
        #Make mainwindow
        self.setGeometry(100,100,300,200)
        self.setStyleSheet('background-color: blue')
        
        # Make widget and button objects and set connection
        self.widget = MyWidget()        
        self.btn = QPushButton(self)
        self.btn.setText('Click')
        self.btn.move(175, 150)
        self.btn.setStyleSheet('background-color: white')
        self.btn.clicked.connect(self.widget.showWidget)
        
        self.widget.sig.connect(self.changeToRed)
        
        # Let's start
        self.show()
        
    def changeToRed(self):
        self.setStyleSheet('background-color: red')
        
class MyWidget(QWidget):
    sig = pyqtSignal()

    def __init__(self):
        super().__init__() 
        self.setGeometry(500, 100, 200, 200)
        
    def showWidget(self):
        self.show()
        
    def closeEvent(self, event):
        self.sig.emit()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyMainWindow()
    app.exec()