Question

Y at-il un moyen de réduire dans la barre en PyQt4? Je l'ai déjà travaillé avec la classe QSystemTrayIcon, mais maintenant je voudrais minimiser ou « cacher » ma fenêtre d'application, et de montrer que l'icône de la barre.

Quelqu'un at-il fait cela? Toute direction serait appréciée.

En utilisant Python 2.5.4 et PyQt4 sur Windows XP Pro

Était-ce utile?

La solution

Il est assez simple une fois que vous vous souvenez qu'il n'y a aucun moyen de minimiser effectivement la barre d'état système .

Au lieu de cela, vous truquer en faisant ceci:

  1. Attrapez l'événement minimiser votre fenêtre
  2. Dans le gestionnaire d'événements minimiser, créer et afficher un QSystemTrayIcon
  3. Toujours dans le gestionnaire d'événements minimiser, cacher des appels () ou setVisible (false) sur la fenêtre
  4. Catch un clic / double-cliquez sur / élément de menu sur l'icône de la barre système
  5. Dans votre gestionnaire d'événements icône de la barre système, émission d'appels () ou setVisible (true) sur la fenêtre, et éventuellement masquer votre icône de la barre.

Autres conseils

code aide, alors voici quelque chose que j'ai écrit pour une application, à l'exception du closeEvent au lieu de l'événement minimiser.

Notes:

« closeEvent (événement) » est un événement Qt substituée, il doit être mis dans la classe qui implémente la fenêtre que vous voulez cacher.

« okayToClose () » est une fonction que vous pourriez envisager d'appliquer (ou un drapeau booléen vous pouvez stocker) car parfois vous voulez vraiment quitter l'application au lieu de minimiser au systray.

Il y a aussi un exemple de la façon de montrer () votre fenêtre.

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()

Il suffit d'ajouter à l'exemple de Chris:

Il est essentiel que vous utilisez la notation Qt lors de la déclaration du signal, i.e..

correcte :

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

et non le PyQt un

incorrect et ne fonctionnera pas:

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

Notez la :: dans la chaîne de signal. Cela m'a pris environ trois heures pour comprendre.

Voici qui marche code..Thanks Matze Crucial , le signal m'a pris plus d'heures de curiosité .. mais faire d'autres choses. si ta un #! instant: -)

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

Ce fut une modification de la réponse de vzades, mais elle a été rejetée sur un certain nombre de motifs. Il fait exactement la même chose que leur code mais aussi obéir à l'événement réduisent au minimum (et exécuter sans erreurs de syntaxe / icônes manquantes).

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()

Ceci est la bonne façon de gérer un double clic sur une icône de la barre pour PyQt5.

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

Ceci est le code et il ne me aide, je crois en visualisera le code

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top