Problem mit QSystemTrayIcon

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Hey nochmal!

Ich möchte in mein Programm auch einen SystremTrayIcon einbetten, und hab dafür folgenden Code geschrieben:

Code: Alles auswählen

class SystemTray(QSystemTrayIcon):

    def __init__(self, parent = None):
        QSystemTrayIcon.__init__(self, parent)
        self.parent = parent
        self.setIcon(QIcon("..\\Res\\WindowIcon.png"))
        tooltip = "xxx"
        if self.parent.connected:
            tooltip += " [Angemeldet"
            if self.parent.secure_mode:
                tooltip += " mit Vollzugriff"
            tooltip += "]"
        self.setToolTip(tooltip)
        self.activated.connect(self.handler)
        QApplication.instance().aboutToQuit.connect(self.hide)

    def handler(self, reason):
        if reason == QSystemTrayIcon.DoubleClick: #Icon double clicked
            if self.parent.isVisible():
                self.parent.hide()
            else:
                self.parent.show()
Funktioniert auch alles, aber wenn ich das Programm starte und anschließend wieder beende bleibt der Icon im Systemtray solange, bis ich einmal mit der Maus darüberfahre. Dann verschwindet er von ganz alleine...
Ist das normal oder mach ich was falsch?
Dies ist keine Signatur!
lunar

Ich kenne dieses „Phänomen“ (im Übrigen ein Windows-spezifisches), es entsteht dadurch, dass das Symbol nicht vor dem Ende des Prozesses freigegeben wird. Allerdings leider nicht von Qt, insofern kann ich jetzt nichts allzu zielführendes sagen, und nur raten, eventuell ".aboutToQuit.connect(self.hide)" durch ".aboutToQuit.connect(self.deleteLater)" zu ersetzen.

Dazu noch eine Anmerkung allgemeiner Natur: Binde "parent" bitte nicht an "self.parent". Damit „überschreibst“ Du die Qt-Methode ".parent()", welche Dir das Vaterobjekt zurückgibt. Für andere Qt-Programmierer ist es ziemlich überraschend, wenn ".parent" auf einmal keine Methode, sondern vielmehr ein einfaches Attribut ist. Entferne also bitte die zweite Zeile von ".__init__()", und schreibe "self.parent().connected" oder "self.parent().secure_mode".
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Super, danke! Funktioniert tadellos!
Hab auch alle "self.parent"s durch "self.parent()"s ersetzt.
Dies ist keine Signatur!
Antworten