2010-09-30 3 views
5

Je collecte des statistiques d'utilisation pour mes applications, qui indiquent la durée de chaque session. Cependant, je ne peux pas sembler pouvoir enregistrer cette information parce qu'aucun des signaux que j'ai essayés réussit réellement à appeler ma fonction de report_session.Existe-t-il un moyen d'appeler une fonction juste avant la fin d'une application PyQt?

Ce sont les signaux que je l'ai déjà essayé:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. détruits()

Soit ces signaux ne sont jamais émis ou l'application ne ne pas vivre assez longtemps après cela pour courir autre chose. Voici ma 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_()) 

Répondre

1

Trouvé this answer qui implique la surcharge de closeEvent().

cela a fonctionné parfaitement pour moi.

2

Mettre le code entre app.exec_ et sys.exit:

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

Pour vous assurer une fonction Python est appelé à la fin du processus, en général (avec ou sans Qt impliqué ;-) , vous pouvez utiliser le module atexit de la bibliothèque standard Python:

import atexit 

def whatever(): ... 

atexit.register(whatever) 

par prudence, je recommande de ne pas utiliser une méthode liée au lieu d'une fonction à cet effet - cela «devrait» fonctionner, mais la phase de destruction d'un processus est toujours quelque peu délicate, et plus vous la gardez simple, mieux c'est.

atexit ne se déclenche pas pour un accident suffisamment dur d'un processus, bien sûr (par exemple, si le processus est tué avec un kill -9, puis par définition il est pas donné une chance d'exécuter un code de terminaison) - - l'OS voit à cela ;-). Si vous avez besoin de gérer un accident, peu importe comment vous devez le faire à partir d'un processus de "surveillance" distinct, un problème sensiblement plus subtil.

+0

Je n'ai pas essayé cela, bien que je connaissais le module atexit. J'ai fini par préférer réimplémenter la méthode closeEvent de QApplication. – fccoelho

3

La méthode que Mark Byers a affichée sera exécutée après la fermeture du widget principal, ce qui signifie que ses contrôles ne seront plus disponibles.

Si vous avez besoin de travailler avec des valeurs de contrôles sur votre formulaire, vous voulez capturer l'événement près et y faire votre travail:

class MainWidget(QtGui.QWidget): 

    #... 

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

Aussi, voir l'exemple boîte de message dans le tutoriel ZetCode First programs in PyQt4 toolkit (vers la fin de la page). Ceci montre comment accepter ou annuler la demande de fermeture.

Questions connexes