versiones guia español actualizar python qt qt4 pyqt pyqt4

python - guia - Manera correcta de manejar el botón Cerrar en una ventana principal PyQt,(Red "X")



qgis español (2)

En primer lugar, soy un completo novato en PyQt.

He intentado vincular una función con el botón de cerrar la ventana principal (la x roja en la esquina de la ventana) pero no he tenido éxito. En este momento, mi código se ve más o menos así:

class Ui_MainWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.setupUi(self) def setupUi(self, MainWindow): #setup code goes here def retranslateUi(self, MainWindow): #re translation of the GUI code def closeEvent(self, event): print "User has clicked the red x on the main window"

En un archivo separado "principal" tengo el siguiente:

class GUIForm(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self,parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) #self.ui.ECUStatus_txt = MyWidget.__init__.text_list self.threadData() if __name__ == "__main__": app = QtGui.QApplication(sys.argv) myapp = GUIForm() myapp.show() ret = app.exec_() sys.exit(ret)

Sin embargo, cuando me ejecuto a través del símbolo del sistema, no puedo ver la declaración de impresión cuando toco la x roja. Sé que soy nuevo en Qt, pero he visto a muchas personas hacer esta pregunta, y ninguna de las respuestas parecía ir más allá de lo que ya está escrito anteriormente.

Una de estas respuestas: Respuesta # 1 Respuesta # 2

Ambas soluciones son similares a las mías, pero todavía no funciona

A pesar de la respuesta, que puede haber funcionado para el código específico de ese usuario, mis compañeros colegas de PyQt y yo todavía estamos bastante nublados por el hecho de que el nuestro no funciona. ¿Hay un nombre de botón definido para el "cuadro X rojo" integrado en PyQt? ¿Puedo conectarlo a otra función, de alguna manera lo haría con otros botones?


Nunca deberías modificar la clase que se generó desde tu archivo ui. En su lugar, debe subclasificar y modificar la subclase.

Desde el aspecto de su código, en realidad está creando dos QMainWindow s y closeEvent está siendo capturado por el incorrecto (¿presumiblemente uno 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, usted está usando explícitamente el método Ui_MainWindow.setupUi() usted mismo, para agregar los widgets a su propia QMainWindow , ''GUIForm`.

En cambio, lo que debe hacer es dejar su clase Ui_MainWindow tal como estaba cuando se generó desde el archivo ui, y luego modificar su archivo principal de python 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á extendiendo el comportamiento del archivo UI generado automáticamente. Esto hace que sea más fácil regenerar el archivo python desde el archivo .ui sin tener que volver a agregar el código (esta es precisamente la razón por la que nunca debe modificar el archivo de Python generado automáticamente)


Algunas 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 la función closeEvent .

Nota :

aplicación es el nombre de la instancia QtGui.QApplication

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.