PyQt, SystemTrayIcon und Windows-Abmeldung/Shutdown

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

PyQt, SystemTrayIcon und Windows-Abmeldung/Shutdown

Beitragvon tatsu » Mittwoch 14. Januar 2009, 15:13

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:

Beitragvon InSecMa » Donnerstag 15. Januar 2009, 01:07

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder