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 :

Comment exécuter une fonction la perte de focus QCombobox Pyqt6 ? [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 110
    Par défaut Comment exécuter une fonction la perte de focus QCombobox Pyqt6 ?
    Bonjour à tous,

    Je débute avec Python et plus encore avec Qt, j'ai mis en place mon IHM avec quelques Widgets tel que Tableview où j'ai pu charger celui-ci avec une BDD.

    Aujourd'hui, je souhaite exécuter une fonction lorsque je perds le focus d'une combobox. J'ai trouvé une fonction d'une Widget Combobox nommée "focusOutEvent", je pense être sur la bonne voie mais honnêtement je galère à trouver une solution, c'est d'ailleurs pour cela que je vous écris aujourd'hui.

    Je voudrais savoir si vous auriez une idée sur comment mettre en place mon objectif ?

    Je vous met ci-dessous un petit bout de mon code ciblé sur ce Widget :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class MainWindow(QMainWindow):
        self.combo = ComboBox(frame)
        self.combo.focusOutEvent()
     
     
    class ComboBox(QComboBox):
        def focusOutEvent(self, event=QFocusEvent):
            super().focusOutEvent(event)
    En vous remerciant à tous d'avance pour votre aide.

  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,

    Voilà un petit code de test (à lancer dans une console pour avoir les print):

    on a une fenêtre QWidget, contenant un QCombobox et un QLineEdit.

    Au lancement, le combobox prend le focus. En cliquant sur le QLineEdit, le combobox perd le focus. Etc...


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtCore, QtWidgets)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        # =======================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
            self.resize(400, 300)
     
            self.combo = QtWidgets.QComboBox(self)
     
            self.line = QtWidgets.QLineEdit(self)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.combo, 0, 0)
            posit.addWidget(self.line, 1, 0)
            self.setLayout(posit)
     
            self.combo.focusInEvent = self.focusInEvent
            self.combo.focusOutEvent = self.focusOutEvent
     
            self.combo.setFocus()
            self.combofocus = True
     
        # =======================================================================
        def focusInEvent(self, event):
     
            if self.combo.hasFocus():
                print("le combo prend le focus!")
                self.combofocus = True
                event.accept()
            else:
                super().focusInEvent(self, event)
     
        # =======================================================================
        def focusOutEvent(self, event):
     
            if self.combofocus:
                print("le combo perd le focus!")
                self.combofocus = False
                event.accept()
            else:
                super().focusOutEvent(self, event)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 110
    Par défaut
    Bonjour tyrtamos,

    Tout d'abord, merci pour ton aide c'est très gentil !

    Dans un 1er temps, j'ai essayé ton code est il fonctionne très bien. Ensuite j'ai voulu l'adapter à ce que j'ai fait, idem ça fonctionne, cependant j'ai un petit soucis.

    Lorsque je quitte la combobox, le curseur reste et j'en ai un nouveau qui apparaît en fonction du Widget que j'utilise (ex : lineEdit apparaît un nouveau curseur et dans la combo le curseur est toujours présent).
    Je ne vois pas pourquoi celui-ci reste ?

    Ensuite, j'ai un autre soucis. Si je laisse la section :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            else:
                super().focusOutEvent(self, event)
    J'ai un message d'erreur venant de l'éditeur concernant la variable "event", il me marque "Unexpected argument ", pour info : J'utilise Pyqt6 (peut-être que c'est ça le soucis).

    En te remerciant d'avance pour ton aide.

  4. #4
    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

    Citation Envoyé par Jb_One36 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            else:
                super().focusOutEvent(self, event)
    J'ai un message d'erreur venant de l'éditeur concernant la variable "event", il me marque "Unexpected argument ", pour info : J'utilise Pyqt6 (peut-être que c'est ça le soucis).
    Erreur de ma part: il faut retirer le "self, "

    Je regarde les autres aspects.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 110
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour



    Erreur de ma part: il faut retirer le "self, "

    Je regarde les autres aspects.
    -----------------------------------------------------------------------
    Merci pour ton aide tyrtamos !

    Après en réfléchissant sur ce que tu as écrit, je pense que j'aurai pu trouver pour cette partie.
    Par contre, pour l'histoire du focus, j'avoue ne pas comprendre ???

    En tout cas, merci beaucoup.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 839
    Billets dans le blog
    1
    Par défaut
    Salut

    Citation Envoyé par tyrtamos Voir le message
    Je regarde les autres aspects.
    J'adore quand tu postes un code car j'apprends plein de trucs. Ici aussi je me suis empressé de le tester.

    J'ai quand-même une petite question sur le fait que tu n'appelles super() que dans le cas où le combo n'a pas le focus.
    Dans ma logique, j'aurais écrit les focusIn et focusOut ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def focusInEvent(self, event):
    	super().focusInEvent(event)
    	if self.combo.hasFocus():
    		print("le combo prend le focus!")
    		self.combofocus = True
     
    def focusOutEvent(self, event):
    	super().focusOutEvent(event)
    	if self.combofocus:
    		print("le combo perd le focus!")
    		self.combofocus = False

    De fait, cette solution (dans laquelle j'ai viré le event.accept() que je ne pense pas utile) semble donner le même résultat...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    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

    Citation Envoyé par Sve@r Voir le message
    J'adore quand tu postes un code car j'apprends plein de trucs. Ici aussi je me suis empressé de le tester.
    Et tes questions pertinentes me poussent dans mes retranchements et me forcent à progresser: merci!

    J'ai recherché sur le web, et comme souvent, je retrouve mes propres écrits (!). J'ai ainsi trouvé ce fil ancien de 2010 qui traite du sujet:
    https://www.developpez.net/forums/d9...ent-qlineedit/

    Je préfère nettement la solution décrite dans le message #7 de ce fil. Après conversion en Python 3 et adaptation au problème présent, voilà ce que ça donne (à lancer dans une console pour avoir les prints):

    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
    39
    40
    41
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    #############################################################################
    class MyComboBox(QtWidgets.QComboBox):
     
        def focusOutEvent(self, event):
            print("Le combobox perd le focus")
            super().focusOutEvent(event)
     
        def focusInEvent(self, event):
            print("Le combobox prend le focus")
            super().focusInEvent(event)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setWindowTitle("Code test pour focus event")
            self.resize(400, 300)
     
            # créer le QComboBox perso
            self.combo = MyComboBox(self)
            self.combo.setEditable(True) # pour voir le caret avec le focus
     
            # créer le QLineEdit
            self.lineEdit = QtWidgets.QLineEdit(self)
     
            # positionne des 2 widgets dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.combo, 0, 0)
            posit.addWidget(self.lineEdit, 1, 0)
            self.setLayout(posit)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    [edit] Et s'il faut mener une action dans la fenêtre principale en cas de perte de focus du QComboBox spécial, on peut, à partir du focusOutEvent, envoyer un message (emit) avec un signal spécifique (à créer). On peut facilement adapter le code ci-dessus:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    #############################################################################
    class MyComboBox(QtWidgets.QComboBox):
     
        # crée un nouveau signam
        focusChange = QtCore.pyqtSignal(str)
     
        def focusOutEvent(self, event):
            self.focusChange.emit("La 1ère ligne perd le focus")
            super().focusOutEvent(event)
     
        def focusInEvent(self, event):
            self.focusChange.emit("La 1ère ligne prend le focus")
            super().focusInEvent(event)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setWindowTitle("Code test pour focus event")
            self.resize(400, 300)
     
            # créer le QComboBox perso
            self.combo = MyComboBox(self)
            self.combo.setEditable(True) # pour voir le caret avec le focus
            self.combo.focusChange.connect(self.comboFocus)
     
            # créer le QLineEdit
            self.lineEdit = QtWidgets.QLineEdit(self)
     
            # positionne des 2 widgets dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.combo, 0, 0)
            posit.addWidget(self.lineEdit, 1, 0)
            self.setLayout(posit)
     
        def comboFocus(self, msg):
            print(msg)
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())

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

Discussions similaires

  1. Comment exécuter une fonction jQuery depuis un flash ?
    Par supaaa_mika dans le forum jQuery
    Réponses: 0
    Dernier message: 07/11/2011, 15h42
  2. Réponses: 2
    Dernier message: 29/07/2008, 15h04
  3. Réponses: 4
    Dernier message: 21/09/2007, 15h14
  4. Réponses: 2
    Dernier message: 16/07/2007, 16h04
  5. [Débutant]Comment exécuter une fonction tous les jours
    Par pseudomh dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/06/2006, 16h10

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