Shutdown erkennen (Linux)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
bernd59
User
Beiträge: 13
Registriert: Sonntag 8. Januar 2012, 00:31

Mit meinem Code verhindere ich, das das Hauptfenster geschlossen wird.

Code: Alles auswählen

  def closeEvent(self, event):
        if self.isHidden():
            self.media.stop()
            event.accept()
        else:
            self.hide()
Dadurch wird aber der Shutdown der KDE abgebrochen, falls das Fenster nicht Hide ist. Wie kann ich erkennen, ob nur das Fenster geschlossen wird oder der Rechner heruntergefahren wird?

Bernd
lunar

@bernd59: So einfach kannst Du das gar nicht. Es gibt keine Möglichkeit, um zu erkennen, ob das Schließen eines Fensters vom Nutzer oder automatisch vom System veranlasst ist. Es gibt Mittel und Wege drum herum, vor allem Session Management, oder das Reagieren auf bestimmte Ereignisse der Desktop-Umgebung, aber das ändert alles nichts daran, dass Dein Fenster früher oder später geschlossen werden muss.

Warum willst Du dem Benutzer überhaupt das Schließen des Fensters verwehren? Das ist einigermaßen unhöflich dem Nutzer gegenüber…
bernd59
User
Beiträge: 13
Registriert: Sonntag 8. Januar 2012, 00:31

Hallo,

ich möchte erreichen, wenn der Nutzer auf das Kreuzt klickt, das das Programm im Tray minimiert wird. Zum Beenden gibt es einen extra Menüpunkt. (Wie Agregator & Amarok)

Bernd
lunar

@bernd59: Versuche mal, das Fenster pauschal zu verstecken, und das Ereignis explizit zu verwerfen:

Code: Alles auswählen

def closeEvent(self, event):
    self.hide()
    event.ignore()
So verhält sich Amarok ebenfalls, insofern sollte dieser Quelltext funktionieren. Bist Du sicher, dass wirklich Deine Anwendung den Abmeldevorgang von KDE abbricht?
bernd59
User
Beiträge: 13
Registriert: Sonntag 8. Januar 2012, 00:31

Ja, bin ich sicher

Code: Alles auswählen

Abmeldung abgebrochen durch „/usr/bin/nfixplayer“
Liegt es vielleicht daran, daß ich QApplication nutze (Das Programm soll auch unter Lubuntu laufen - Ohne KDE)

Unter Lubuntu (Netbook) funktioniert alles.

Bernd
BlackJack

@bernd59: Daran sollt es eigentlich nicht liegen. Als nächstes würde ich an Deiner Stelle mal eine minimale, aber lauffähige Anwendung schreiben, die das Problem demonstriert und die zeigen. Damit das hier mehr Leute mal nachvollziehen können.
lunar

@bernd59: Du hast recht. Tatsächlich verwirft Qt die Aufforderung der Fensterverwaltung, die Anwendung zu beenden, wenn das Ereignis beim Hauptfenster verworfen wird, und in der Folge glaubt die Sitzungsverwaltung von KDE, dass die Anwendung noch nicht beendet werden darf.

Die einfache Lösung wäre, dass Fenster nicht zu verstecken, sondern tatsächlich zu schließen, und ein neues Fenster zu erzeugen, wenn es wieder angezeigt werden soll. Dazu musst Du lediglich "QApplication.quitOnLastWindowClosed" deaktivieren, damit die Anwendung im Hintergrund weiterläuft. Sofern es nicht unbedingt erforderlich ist, dass das Fenster geöffnet bleibt, wäre das diejenige Lösung, die ich ob ihrer Einfachheit wählen würde.

Die kompliziertere, aber richtige(TM) Lösung wäre, die Anwendung um Unterstützung für die Sitzungsverwaltung zu erweitern. In Deinem Anwendungsfall beläuft sich das wohl darauf, von "QApplication" abzuleiten, dort "commitData()" zu überschreiben, in dieser Methode ein Flag zu setzen, welches signalisiert, dass die Sitzung beendet wird, dieses Flag in ".closeEvent()" abzufragen, und falls es gesetzt ist, dass Ereignis nicht zu verwerfen, sondern zu akzeptieren. So geht Amarok tatsächlich vor, hat es allerdings einfacher, da KDE diese Logik in KApplication bereits implementiert und "KApplication.sessionSaving()" zur Verfügung stellt, um zu prüfen, ob gerade die Sitzung beendet wird.
bernd59
User
Beiträge: 13
Registriert: Sonntag 8. Januar 2012, 00:31

Danke, ich habe die 2. Variante genutzt. Und sie funktioniert

Bernd
Antworten