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.