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 QMainWindow
sy 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.