2010-09-30 18 views
5

Ich sammle Nutzungsstatistiken für meine Anwendungen, die beinhalten, wie viel jede Sitzung dauert. Ich kann jedoch nicht in der Lage sein, diese Information zu speichern, da keines der Signale, die ich versuchte, tatsächlich meine report_session-Funktion aufruft.Gibt es eine Möglichkeit, eine Funktion direkt vor dem Beenden einer PyQt-Anwendung aufzurufen?

Dies sind die Signale habe ich schon versucht:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. zerstört()

Entweder sind diese Signale nie emittiert erhalten oder die Anwendung funktioniert nicht lange genug danach leben, um etwas anderes zu führen. Hier ist meine Haupt:

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

Antwort

1

Gefunden this answer was zu einem Überladen von closeEvent() führt.

es funktionierte perfekt für mich.

2

Setzen Sie den Code zwischen app.exec_ und sys.exit:

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

Um sicherzustellen, dass eine Python-Funktion bei Beendigung des Prozesses aufgerufen wird, im Allgemeinen (mit oder ohne Qt beteiligt ;-) können Sie das atexit Modul der Standard-Python-Bibliothek verwenden:

import atexit 

def whatever(): ... 

atexit.register(whatever) 

aus Vorsicht I gegen die Verwendung eine gebundene Methode empfehlen würde anstatt einer Funktion für diesen Zweck - es "sollte" funktionieren, aber die Zerstörungsphase eines Prozesses ist immer etwas heikel, und je einfacher Sie es halten, desto besser.

atexit wird für einen ausreichend harten Absturz eines Prozesses nicht auslösen, natürlich (zB wenn der Prozess mit einem kill -9 getötet wird, dann definitions ihm nicht gegeben hat eine Chance, auch nach Beendigung Code auszuführen) - - Das OS sorgt dafür ;-). Wenn Sie einen Absturz behandeln müssen, egal wie hart Sie dies tun müssen, von einem separaten "Watchdog" -Prozess, ein wesentlich subtileres Problem.

+0

Ich habe das nicht versucht, obwohl ich das Atexit-Modul kannte. Am Ende habe ich es vorgezogen, die CloseEvent-Methode von QApplication neu zu implementieren. – fccoelho

3

Die von Mark Byers gepostete Methode wird ausgeführt, nachdem das Hauptwidget geschlossen wurde. Dies bedeutet, dass die Steuerelemente nicht mehr verfügbar sind.

Wenn Sie mit irgendwelchen Werten von Kontrollen auf dem Formular arbeiten müssen, sollten Sie die enge Ereignis erfassen und tun, um Ihre Arbeit dort:

class MainWidget(QtGui.QWidget): 

    #... 

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

Außerdem finden Sie in der Message-Box Beispiel im ZetCode Tutorial First programs in PyQt4 toolkit (am Ende der Seite). Hier wird angezeigt, wie Sie die Schließanforderung annehmen oder abbrechen können.

Verwandte Themen