2010-09-30 7 views
5

Sto raccogliendo le statistiche di utilizzo per le mie applicazioni che includono quanto dura ogni sessione. Tuttavia, non riesco a essere in grado di salvare questa informazione perché Nessuno dei segnali che ho provato, in realtà, riesce a chiamare la mia funzione report_session.C'è un modo per chiamare una funzione appena prima che un'applicazione PyQt finisca?

Questo sono i segnali ho già provato:

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

Entrambi questi segnali non vengono emessi o l'applicazione fa non vivere abbastanza a lungo dopo quello per eseguire qualsiasi altra cosa. Qui è il mio principale:

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_()) 

risposta

1

Trovato this answer che implica il sovraccarico di closeEvent().

ha funzionato perfettamente per me.

2

mettere il codice tra il app.exec_ e sys.exit:

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

per garantire che una funzione Python viene chiamata a terminazione di processo, in generale (con o senza Qt coinvolti ;-) , è possibile utilizzare il modulo atexit della libreria standard di Python:

import atexit 

def whatever(): ... 

atexit.register(whatever) 

Per prudenza mi sento di raccomandare di non usare un metodo vincolato invece di una funzione per questo scopo, "dovrebbe" funzionare, ma la fase di distruzione di un processo è sempre un po 'delicata, e più semplice la si mantiene, meglio è.

atexit non si innescherà per un crash sufficientemente duro di un processo, naturalmente (ad esempio, se il processo viene ucciso con un kill -9, poi per definizione non è data la possibilità di eseguire qualsiasi codice di terminazione) - - il sistema operativo lo vede ;-). Se è necessario gestire qualsiasi incidente, non importa quanto sia difficile farlo da un processo di "watchdog" separato, un problema sostanzialmente più sottile.

+0

Non l'ho provato, anche se ero a conoscenza del modulo atexit. Alla fine ho preferito reimplementare il metodo closeEvent di QApplication. – fccoelho

3

Il metodo che Mark Byers ha pubblicato verrà eseguito dopo che il widget principale è stato chiuso, il che significa che i suoi controlli non saranno più disponibili.

Se avete bisogno di lavorare con i valori dai controlli sul modulo, si vuole catturare l'evento close e fare il vostro lavoro lì:

class MainWidget(QtGui.QWidget): 

    #... 

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

Inoltre, vedere l'esempio Message Box nel tutorial ZetCode First programs in PyQt4 toolkit (vicino alla fine della pagina). Questo mostra come accettare o cancellare la richiesta di chiusura.