2010-09-30 11 views
5

Estoy recopilando estadísticas de uso para mis aplicaciones que incluyen cuánto dura cada sesión. Sin embargo, parece que no puedo guardar esta información porque Ninguna de las señales que probé realmente logra llamar a mi función report_session.¿Hay alguna manera de invocar una función justo antes de que finalice una aplicación PyQt?

Estos son las señales que ya he intentado:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. destruidas()

Cualquiera de estas señales nunca se emiten o la aplicación no No vivir lo suficiente después de eso para ejecutar cualquier otra cosa. Aquí es mi principal:

app = QtGui.QApplication(sys.argv) 

ui = MainWindow() 
ui.app = app 
QtCore.QObject.connect(ui, QtCore.SIGNAL("destroyed()"), ui.report_session) 
ui.show() 
logger.info('Started!') 
splash.finish(ui) 

sys.exit(app.exec_()) 

Respuesta

1

Encontrado this answer que implica sobrecargar closeEvent().

funcionó perfectamente para mí.

2

poner el código entre app.exec_ y sys.exit:

ret = app.exec_() 
# Your code that must run when the application closes goes here 
sys.exit(ret) 
4

para asegurar que una función de Python se llama a la terminación del proceso, en general (con o sin Qt involucrados ;-) , se puede utilizar el módulo de atexit de la biblioteca estándar de Python:

import atexit 

def whatever(): ... 

atexit.register(whatever) 

Por prudencia recomendaría contra el uso de un método vinculado en lugar de una función para este propósito, "debería" funcionar, pero la fase de destrucción de un proceso siempre es algo delicada, y cuanto más simple se mantenga, mejor.

atexit no activará durante un accidente lo suficientemente dura como un proceso, por supuesto (por ejemplo, si el proceso se mató con un kill -9, entonces por definición no ha dado la oportunidad de ejecutar cualquier código de terminación) - - el sistema operativo se encarga de eso ;-). Si necesita manejar cualquier bloqueo, sin importar qué tan difícil deba hacerlo, desde un proceso separado de "vigilancia", un problema sustancialmente más sutil.

+0

No lo he intentado, aunque era consciente del módulo atexit. Terminé prefiriendo volver a implementar el método closeEvent de QApplication. – fccoelho

3

El método que Mark Byers publicó se ejecutará después de que se haya cerrado el widget principal, lo que significa que sus controles ya no estarán disponibles.

Si tiene que trabajar con cualquiera de los valores de los controles en su formulario, tendrá que capturar el evento de cierre y hacer su trabajo allí:

class MainWidget(QtGui.QWidget): 

    #... 

    def closeEvent(self, event): 
     print "closing PyQtTest" 
     self.SaveSettings() 
     # report_session() 

Además, vea el ejemplo de cuadro de mensaje en el tutorial ZetCode First programs in PyQt4 toolkit (cerca del final de la página). Esto muestra cómo aceptar o cancelar la solicitud de cierre.

Cuestiones relacionadas