PyQt, SystemTrayIcon und Windows-Abmeldung/Shutdown

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
tatsu
User
Beiträge: 7
Registriert: Donnerstag 18. September 2008, 19:12

Hallo alle zusammen,

ich habe ein GUI-Programm unter Verwendung von PyQt geschrieben. Das Programm läuft im SystemTray unter Windows 2000/XP/Vista.

Ich nutze "app.setQuitOnLastWindowClosed(False)" da die Anwendung nicht beendet werden soll, wenn das Hauptfenster geschlossen wird.

Nun habe ich das Problem, dass das Programm noch Aktionen ausführen soll, wenn ein Nutzer sich abmeldet, bzw. den Rechner herunterfährt.

Da kein aktives Fenster zum Zeitpunkt des Abmeldens/Herunterfahrens geöffnet ist (da SystemTray) schaffe ich es nicht eine Funktion oder Methode auszuführen, bevor sich das Programm beendet.

Folgende Dinge habe ich probiert:

1. atexit.register(MethodeA)
2. SetConsoleCtrlHandler (MethodeB, True)
3. MainWindow.connect(MainWindow, QtCore.SIGNAL('aboutToQuit()'), MethodeC)
4. signal.signal(signal.SIGBREAK, MethodeD)

Auch stundenlanges Googlen nach möglichen Problemlösungen hat nicht geholfen.

Ich bin Pyhtonnewbee und wäre für jede Hilfe dankbar.

Viele Grüße

Bastian
Zuletzt geändert von tatsu am Donnerstag 15. Januar 2009, 01:10, insgesamt 1-mal geändert.
InSecMa
User
Beiträge: 1
Registriert: Donnerstag 15. Januar 2009, 01:02
Wohnort: Berlin, Hamburg
Kontaktdaten:

Die Lösung liegt darin eine Ableitung der Klasse "QtGui.QApplication" zu erstellen und die Methode "winEventFilter" zu "überladen".

Beispiel:

Code: Alles auswählen

# Ableitung von QtGui.QApplication um Methode für Windowsevents zu "überladen"
class IecQApplication(QtGui.QApplication):
    def winEventFilter(self, msg):      
        # freundliches Windows-Signal fuer Programmende abfangen (bei Nutzerabmeldung, Herunterfahren und Neustart von Windows)
        if msg.message == WM_QUERYENDSESSION:
            # Aufäum-Methode aufrufen
            mainWindow.quitNow() 
        
        return QtGui.QApplication.winEventFilter(self, msg)


if __name__=='__main__':
    # QT-Applikation initialisieren    
    app = IecQApplication(sys.argv)

InSecMa Solutions GmbH - http://www.insecma.de
Antworten