IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Réduire une fenêtre dans la barre des tâches


Sujet :

PyQt Python

  1. #1
    Invité
    Invité(e)
    Par défaut Réduire une fenêtre dans la barre des tâches
    Bonjour à tous

    Voilà, je suis en Python avec PyQt4, mais je suppose que la question reste valide.
    J'ai une fenêtre que je souhaite réduire dans le systray. Jusque là pas de problème. Je regarde l'example fourni avec la doc, et je me fais une petite classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class Form(QtGui.QWidget):
     
        def __init__(self):
            super(Form, self).__init__()
            self.trayIcon = QtGui.QSystemTrayIcon(QtGui.QIcon("images/icon.png"), self)
            QtCore.QObject.connect(self.trayIcon,
                                   QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"),
                                   self.icon_activated)
     
        def closeEvent(self, event):
            if not self.trayIcon.isVisible():
                self.trayIcon.show()
                self.hide()
                event.ignore()
            else:
                event.accept()
     
        def icon_activated(self, reason):
            if reason == QtGui.QSystemTrayIcon.Trigger:
                self.trayIcon.hide()
                self.show()
    On ferme la fenêtre, elle va dans le systray.
    On clique sur l'icône dans le systray, la fenêtre revient.
    Bien, cela marche correctement, mais ce n'est pas tout à fait ce que je veux.

    Je veux que la fenêtre aille dans le systray lorsqu'on la réduit.
    Je remplace le closeEvent par un hideEvent (même contenu), mais le comportement n'est plus du tout le même.

    1) Sous Linux, la fenêtre disparaît bien de la barre des tâches, mais pas sous Windows
    2) Lorsque je restaure ma fenêtre, elle n'est plus au premier plan, mais en arrière.

    Quelqu'un pourrait-il m'expliquer ce que je fais de travers ?
    Merci d'avance

    Qt 4.4
    PyQt 4.4.2
    Python 2.5.2

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Je ne connais pas beaucoup Qt, et ne pourrai par conséquent pas te donner de réponse précise, mais ce qui suit pourrait t'aider.

    J'ai lu un jour dans les sources d'un programme sous PyGtk que, sous windows, une trayicon nécessitait une fenêtre active. Je ne pense pas que ça influe dans ton cas, mais qui sait...

    Pour ce qui est de faire passer la fenêtre au premier plan, ça ne m'étonnerait pas que, comme dans pas mal de lib gui, ce soit une fonction différente du show standard, qui s'occupe juste de rendre un widget visible. Sous PyGtk (encore et tjs...), il s'agit de la fonction window.present(). Bref... cherche une autre fonction

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ce qui est bizarre, c'est que tout marche bien quand je réimplémente le CloseEvent.
    Les choses partent un peu en vrille lorsque je réimplémente un ChangeEvent ou un HideEvent.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Avec ça on dirait que tout marche.
    En effet, il semble y avoir une fonction à part pour afficher une fenêtre qui a été minimisée ^^;
    Honte sur moi pour ne pas avoir lu la doc plus en profondeur avant
    Qt, c'est quand même super...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class Form(QtGui.QWidget):
     
        def __init__(self):
            super(Form, self).__init__()
            self.trayIcon = QtGui.QSystemTrayIcon(QtGui.QIcon("images/icon.png"), self)
            self.trayIcon.show()
            QtCore.QObject.connect(self.trayIcon,
                                   QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"),
                                   self.icon_activated) 
     
        def icon_activated(self, reason):
            if reason == QtGui.QSystemTrayIcon.Trigger and not self.isVisible():
                self.showNormal()
     
        def changeEvent(self, event):
            if event.type() == QtCore.QEvent.WindowStateChange:
                if self.isMinimized():
                    self.hide()

  5. #5
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Ah bien

    Du coup, c'était quoi ? showNormal() pour la faire passer au premier plan, et hide() sur la fenêtre minimisée pour la faire disparaître ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui, le problème c'est que ça ne marche que sous Linux.
    Sous Windows, je garde ma fenêtre dans la barre des tâches, ce qui ne correspond pas à ce que je voulais faire initialement.
    Ah que c'est compliqué le multiplateforme...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Voici un code très simple pour reproduire le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    from PyQt4 import QtCore, QtGui
     
    class Form(QtGui.QWidget):
     
        def __init__(self):
            super(Form, self).__init__()
     
        def changeEvent(self, event):
            if event.type() == QtCore.QEvent.WindowStateChange:
                if self.isMinimized():
                    self.hide()
     
     
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        widget = QtGui.QWidget()
        widget.setWindowTitle("Widget Normal")
        widget.show()
        widget2 = Form()
        widget2.setWindowTitle("Widget Modifie")
        widget2.show()
        app.exec_()
    Help !!!

  8. #8
    Invité
    Invité(e)
    Par défaut
    Ok, j'ai trouvé une façon de faire, mais je ne sais pas pourquoi elle marche.
    Le truc est de passer par un thread. Je suppose que dans mon cas, j'appelais hide() avant que la fenêtre ne soit effectivement minimisée (timing du gestionnaire de fenêtre) et que du coup le fait de minimiser un widget caché le laisse dans la barre des taches.
    Avec le thread, le widget est bien minimisé d'abord, puis caché ensuite.
    Je m'y perds un peu par contre... un expert Python ou Qt pour m'éclairer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    class Thread(QtCore.QThread):
        def __init__(self, widget):
            super(Thread, self).__init__()
            self.widget = widget
     
        def run(self):
            self.widget.hide()
     
    class Form(QtGui.QWidget):
     
        def __init__(self):
            super(Form, self).__init__()
            self.thread = Thread(self)
     
        def changeEvent(self, event):
            if event.type() == QtCore.QEvent.WindowStateChange:
                if self.isMinimized():
                    self.thread.start()
     
    if __name__ == '__main__':
        app = QtGui.QApplication([])
        widget = QtGui.QWidget()
        widget.setWindowTitle("Widget Normal")
        widget.show()
        widget2 = Form()
        widget2.setWindowTitle("Widget Modifie")
        widget2.show()
        app.exec_()

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/03/2008, 09h55
  2. Réduire une application dans la barre des taches
    Par sylchar dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/04/2007, 16h26
  3. Cacher une fenêtre de la barre des tâches
    Par rozwel dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 07/01/2007, 19h53
  4. Ajouter une icône d'une application dans le barre des tâches
    Par Lorponos dans le forum Autres Logiciels
    Réponses: 11
    Dernier message: 13/05/2006, 19h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo