es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PyQt5 – Detectando cuando otra ventana se cierra

Estoy usando PyQt5 y necesito que mi ventana principal detecte cuando otra ventana se cierra. Leí aquí https://stackoverflow.com/questions/62654525/emit-a-signal-from-another-class-to-main-class que crear una clase de señal para que sirva como intermediario debería funcionar. Sin embargo, no he logrado que mi ejemplo funcione.

En mi ejemplo, al hacer clic en el botón se abre una ventana QWidget. Cuando se cierra la QWidget, se supone que la ventana principal debe cambiar de un fondo azul a un fondo rojo. Sin embargo, la ventana principal permanece azul utilizando el siguiente script.

¿Qué estoy haciendo mal?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que la instancia MyWidget en MyMainWindow no está conectada a la instancia MySignal. En la configuración actual, MySignal solo está conectado a la función changeToRed en MyMainWindow. Para solucionar esto, agrega la siguiente línea después de crear la instancia MyWidget en MyMainWindow:

    self.widget.sig.signal.connect(self.mySignal.signal)
    

    Esto conecta la señal signal en la instancia MyWidget con la señal signal en la instancia MySignal, que emitirá la señal cuando la ventana de MyWidget se cierre.

    El código actualizado se vería así:

    from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget
    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__()
    
            #Crear ventana principal
            self.setGeometry(100,100,300,200)
            self.setStyleSheet('background-color: blue')
    
            # Crear objetos de widget y botón y establecer la conexión
            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)
    
            # Crear objeto de señal y establecer la conexión
            self.mySignal = MySignal()
            self.mySignal.signal.connect(self.changeToRed)
    
            self.widget.sig.signal.connect(self.mySignal.signal)
    
            # Comenzar la aplicación
            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()
    

Comments are closed.