Saltar al contenido

Forma correcta de manejar el botón de cierre en una ventana principal PyQt, (“X” roja)

Solución:

Nunca debe modificar la clase que se generó a partir de su archivo de interfaz de usuario. En su lugar, debe crear una subclase y modificar la subclase.

Por el aspecto de su código, en realidad está creando dos QMainWindowsy el closeEvent está siendo detectado por el incorrecto (¿presumiblemente ese está oculto?). Eso es self.ui es un QMainWindow que no se muestra y no se agrega a la interfaz de usuario de GUIForm. En su lugar, está utilizando el Ui_MainWindow.setupUi() método explícitamente usted mismo, para agregar los widgets a su propio QMainWindow, ‘GUIForm’.

En cambio, lo que debe hacer es dejar su Ui_MainWindow class como estaba cuando se generó a partir del archivo ui, y luego modifique su archivo python principal para que sea:

class GUIForm(Ui_MainWindow):
    def __init__(self, parent=None):
        Ui_MainWindow.__init__(self, parent)
        self.threadData()

    def closeEvent(self, event):
        print "User has clicked the red x on the main window"
        event.accept()


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    myapp = GUIForm()
    myapp.show()
    ret = app.exec_()
    sys.exit(ret)

De esta forma, está ampliando el comportamiento del archivo de IU generado automáticamente. Esto facilita la regeneración del archivo Python desde el archivo .ui sin tener que volver a agregar código (esta es precisamente la razón por la que nunca debe modificar el archivo Python generado automáticamente)

A veces, ocurren problemas al manejar señales de eventos desde la ventana principal.

Puedes usar el código:

app.aboutToQuit.connect(self.closeEvent)

y puede escribir su propio código en el closeEvent función.

Nota :

aplicación es el nombre del QtGui.QApplication ejemplo

Aquí hay una demostración del código completo:

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #{================================

        app.aboutToQuit.connect(self.closeEvent)

        #}================================

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle('Demo')

    #{================================

    def closeEvent(self):
        #Your desired functionality here
        print('Close button pressed')
        import sys
        sys.exit(0)

    #}================================


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Espero eso ayude.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *