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 :

detecter le focus d'une gui [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut detecter le focus d'une gui
    Bonjour,

    Je cherche un moyen de detecter si l'ui est active ou non (self.hasFocus()) au cours de l'execution. Je cherche à executer une function quand l'utilisateur clique sur une autre fenetre (l'ui devient donc inactive) et quand l'utilisateur revient sur l'ui.

    Une idée ?
    Merci

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans une application multifenêtre, on peut savoir si l'une des fenêtres est active avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if QtGui.QApplication.activeWindow()==variabledinstancedelafenetre:
        ...
    Cela marche, même si aucun widget à l'intérieur de la fenêtre n'accepte un focus (une image par exemple).

    Mais dans le cas contraire, on peut, dans la fenêtre à tester, mettre à jour une variable en surchargeant la méthode "eventFilter" et en testant si le focus est 'in' ou 'out'. Si tu es intéressé, je peux proposer du code.

  3. #3
    Membre averti
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut
    Merci,

    voici mon code, tout simple juste pour tester ce cas là :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt4 import QtGui
     
     
    class Mywindow(QtGui.QWidget):
     
        def __init__(self):
            QtGui.QSystemTrayIcon.__init__(self)
            self.initUI()
     
        def initUI(self):
     
            QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
            btn = QtGui.QPushButton('Button', self)
            btn.resize(btn.sizeHint())
            btn.move(10, 10)
            self.setGeometry(300, 300, 250, 150)
     
            #self.connect(self._infocus)
            self.show()
     
        def _infocus(self):
            if self.hasFocus():
                #do focus stuff
            else:
                #do no focus stuff
     
    def main():
        app = QtGui.QApplication(sys.argv)
        win = Mywindow()
        sys.exit(app.exec_())
     
    if __name__ == '__main__':
        main()

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Les widgets ont des méthodes focusInEvent() et focusOutEvent().

    Il faut fixer les règles de focus avec setFocusPolicy()

    Reprenant ton exemple:
    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
    30
    31
    32
    33
    34
    35
     
    # -*- coding: utf-8 -*-
     
    import sys
     
    from PyQt4 import QtCore, QtGui
     
    class Mywindow(QtGui.QWidget):
     
        def __init__(self):
            super(Mywindow, self).__init__()
            btn = QtGui.QPushButton('Button', self)
            btn.resize(btn.sizeHint())
            btn.move(10, 10)
            self.setGeometry(300, 300, 250, 150)
     
            self.setFocusPolicy(QtCore.Qt.StrongFocus)
            self.show()
     
        def focusInEvent(self, event):
            print 'Widget has focus:', self.hasFocus()
            print 'Reason:', event.reason()
     
        def focusOutEvent(self, event):
            print 'Widget has focus:', self.hasFocus()
            print 'Reason:', event.reason()
     
     
    def main():
        app = QtGui.QApplication(sys.argv)
        win = Mywindow()
        sys.exit(app.exec_())
     
    if __name__ == '__main__':
        main()

    Edit: rajouté la raison de l'event.
    http://www.riverbankcomputing.co.uk/...cusPolicy-enum

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il faut clarifier le problème à résoudre!

    Dans une fenêtre qui possède plusieurs widgets susceptibles de recevoir le focus, il y a une différence entre une fenêtre "active" (comme quand on clique sur son bandeau) et une fenêtre qui a le focus.

    Dans ce dernier cas, quand la fenêtre devient active, l'un des widgets "attrape" le focus, et les méthodes focusInEvent et focusOutEvent de la fenêtre ne sont jamais exécutées. Ou il faudrait sous-classer tous les widgets intérieurs et établir un lien entre toutes ces mêmes méthodes.

    En surchargeant la méthode eventFilter de la fenêtre, c'est plus simple parce qu'on peut tester dedans tous les widgets pour savoir qui a le focus "in" ou "out" sans avoir à sous-classer ces widgets.

    En fait, avec le code fourni par kiby56, je ne comprends pas à quel moment ni pourquoi il souhaite poser la question. Si c'est en cliquant sur le bouton, on connait déjà la réponse: la fenêtre sera forcément active!

    @kiby56: donne plus d'explications stp!

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ben, moi j'ai compris que c'était sur la fenêtre que le focus l'intéressait.

    ... Je cherche à executer une function quand l'utilisateur clique sur une autre fenetre (l'ui devient donc inactive) et quand l'utilisateur revient sur l'ui
    Evidemment quand on clique sur le bouton de ladite fenêtre celle-ci perd le focus au profit du bouton. Ce qui apparaît dans mon exemple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. focus dans une cellule d'une JTable
    Par coil dans le forum Composants
    Réponses: 5
    Dernier message: 07/07/2010, 17h15
  2. Focus sur une application Windows
    Par mixi dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/10/2004, 19h57
  3. Detecter la fermeture d'une fenetre MsDos
    Par Akta3d dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/07/2004, 16h53
  4. [VB6]Passer le focus à une instance précedente
    Par Jeremiah dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 16/09/2003, 10h01
  5. Comment basculer le focus depuis une autre form ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/09/2003, 15h54

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