Frage

Gibt es eine Möglichkeit zu minimieren, in PyQt4 den Tray? Ich habe gearbeitet bereits mit der QSystemTrayIcon Klasse, aber jetzt würde Ich mag meine App-Fenster minimieren oder zu „verstecken“, und zeige nur den Tray-Icon.

Hat sich das jemand getan? Jede Richtung würde geschätzt.

Mit Python 2.5.4 und PyQt4 auf Windows XP Pro

War es hilfreich?

Lösung

Es ist ziemlich einfach, wenn Sie sich daran erinnern, dass es keine Möglichkeit gibt, auf die System-Tray .

Stattdessen Sie fälschen, indem Sie diese:

  1. Catch the minimieren Ereignis auf Ihrem Fenster
  2. In den Event-Handler minimieren, erstellen und zeigt eine QSystemTrayIcon
  3. Auch in der Event-Handler, Call hide () oder setVisible (false) auf dem Fenster
  4. minimieren
  5. Fangen Sie einen Klick / Doppelklick / Menüpunkt auf dem System Tray-Symbol
  6. In Ihrem System Tray-Icon Ereignishandler Anruf show () oder setVisible (true) auf dem Fenster und ggf. Ihren Tray-Icon verstecken.

Andere Tipps

-Code hilft, also hier ist etwas, was ich für eine Anwendung geschrieben, mit Ausnahme des closeevent anstelle des minimieren Ereignisses.

Weitere Informationen:

„closeevent (event)“ ist ein außer Kraft gesetzt Qt Ereignis, so dass es in der Klasse gestellt werden müssen, die das Fenster Sie implementiert ausblenden möchten.

„okayToClose ()“ ist eine Funktion, die Sie sich anschauen sollten Implementierung (oder ein boolean-Flag Sie speichern möchten), da manchmal tatsächlich Sie die Anwendung beenden wollen, anstatt zu Systray minimieren.

Es gibt auch ein Beispiel dafür, wie das Fenster wieder zu zeigen, ().

def __init__(self):
  traySignal = "activated(QSystemTrayIcon::ActivationReason)"
  QtCore.QObject.connect(self.trayIcon, QtCore.SIGNAL(traySignal), self.__icon_activated)

def closeEvent(self, event):
  if self.okayToClose(): 
    #user asked for exit
    self.trayIcon.hide()
    event.accept()
  else:
    #"minimize"
    self.hide()
    self.trayIcon.show() #thanks @mojo
    event.ignore()

def __icon_activated(self, reason):
  if reason == QtGui.QSystemTrayIcon.DoubleClick:
    self.show()

Just zum Beispiel von Chris hinzuzufügen:

Es ist wichtig, , dass Sie die Qt-Notation verwenden, wenn das Signal zu erklären, d.

richtig :

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.iconClicked)

und nicht die PyQt ein

falsch und wird nicht funktionieren:

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon.ActivationReason)"), self.iconClicked)

Beachten Sie den :: in der Signalkette. Dies dauerte etwa drei Stunden, um herauszufinden.

Hier arbeitet code..Thanks Matze für Crucial , nahm das SIGNAL mir mehr Stunden Neugier .. aber andere Dinge zu tun. so ta für einen #! Moment: -)

def create_sys_tray(self):
    self.sysTray = QtGui.QSystemTrayIcon(self)
    self.sysTray.setIcon( QtGui.QIcon('../images/corp/blip_32.png') )
    self.sysTray.setVisible(True)
    self.connect(self.sysTray, QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.on_sys_tray_activated)

    self.sysTrayMenu = QtGui.QMenu(self)
    act = self.sysTrayMenu.addAction("FOO")

def on_sys_tray_activated(self, reason):
    print "reason-=" , reason

Dies war eine Bearbeitung von vzades Antwort, aber es war auf einer Reihe von Gründen abgelehnt. Es tut genau dasselbe wie ihr Code, sondern auch das Ereignis minimieren gehorchen (und läuft ohne Syntaxfehler / fehlende Symbole).

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        style = self.style()

        # Set the window and tray icon to something
        icon = style.standardIcon(QtGui.QStyle.SP_MediaSeekForward)
        self.tray_icon = QtGui.QSystemTrayIcon()
        self.tray_icon.setIcon(QtGui.QIcon(icon))
        self.setWindowIcon(QtGui.QIcon(icon))

        # Restore the window when the tray icon is double clicked.
        self.tray_icon.activated.connect(self.restore_window)

    def event(self, event):
        if (event.type() == QtCore.QEvent.WindowStateChange and 
                self.isMinimized()):
            # The window is already minimized at this point.  AFAIK,
            # there is no hook stop a minimize event. Instead,
            # removing the Qt.Tool flag should remove the window
            # from the taskbar.
            self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool)
            self.tray_icon.show()
            return True
        else:
            return super(Example, self).event(event)

    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(
            self,
            'Message',"Are you sure to quit?",
            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
            QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            self.tray_icon.show()
            self.hide()
            event.ignore()

    def restore_window(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            self.tray_icon.hide()
            # self.showNormal will restore the window even if it was
            # minimized.
            self.showNormal()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Dies ist der richtige Weg, Doppelklick auf einem Tray-Icon für PyQt5 zu behandeln.

def _create_tray(self):
    self.tray_icon = QSystemTrayIcon(self)
    self.tray_icon.activated.connect(self.__icon_activated)

def __icon_activated(self, reason):
    if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.DoubleClick):
        pass

Dies ist der Code und es tut Hilfe i in Show mir den Code glaube

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout, QSystemTrayIcon


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.icon = QSystemTrayIcon()
        r = self.icon.isSystemTrayAvailable()
        print r
        self.icon.setIcon(QtGui.QIcon('/home/vzades/Desktop/web.png'))
        self.icon.show()
        # self.icon.setVisible(True)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowIcon(QtGui.QIcon('/home/vzades/Desktop/web.png'))
        self.setWindowTitle('Message box')
        self.show()
        self.icon.activated.connect(self.activate)
        self.show()

    def closeEvent(self, event):

        reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes |
                                           QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            self.icon.show()

            self.hide()

            event.ignore()

    def activate(self, reason):
        print reason
        if reason == 2:
            self.show()

    def __icon_activated(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            self.show()


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top