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 :

[PyQt5] LineEdit.clear() avec un completer ne "marche" pas


Sujet :

PyQt Python

  1. #1
    Membre du Club Avatar de ptissendier
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 64
    Points : 53
    Points
    53
    Par défaut [PyQt5] LineEdit.clear() avec un completer ne "marche" pas
    Bonjour,
    Un petit problème d'ergonomie (en toute modestie).
    Voilà je voudrais que mon widget LineEdit se remette à blanc tout seul quand j'ai trouvé ce que je cherchais dans mon QCompleter.
    Comme un dessin étaye mieux une discussion voici mon code (encore une fois en toute modestie)
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    import os, sys
    from PyQt5.QtGui import QStandardItemModel,QStandardItem
    from PyQt5.QtCore import QStringListModel,pyqtSignal
    from PyQt5.QtWidgets import (QApplication,QWidget,QVBoxLayout,
                        QLayout,QLineEdit,QCompleter,
                        QListWidget,QMainWindow)
     
     
    class Principal(QMainWindow):
     
        def __init__(self):
            super().__init__()
     
            myW=QWidget()
            self.setCentralWidget(myW)
            self.setGeometry(500,500,400,200)
            self.setWindowTitle('Test completer.activated')
     
            maliste=os.listdir("/usr/share/applications/")
            slm = QStringListModel()
            slm.setStringList(maliste)
     
            self.c = QCompleter()
            self.c.setCaseSensitivity(0)
            self.c.setObjectName("completer")
            self.c.setModel(slm)
     
     
            self.le = QLineEdit()
            self.le.setPlaceholderText("Recherche ....")
            self.le.setClearButtonEnabled(True)
            self.le.setObjectName("LineEdit")
            self.le.setCompleter(self.c)
            #self.le.editingFinished.connect(self.addItem)
            #self.le.returnPressed.connect(self.addItem)
            self.c.activated.connect(self.addItem)
            self.c.activated.connect(self.le.clear)
     
            self.lw=QListWidget()
            self.lw.setStyleSheet("background-color:LightGrey")
     
            self.vBox=QVBoxLayout()
            self.vBox.addWidget(self.lw)
            self.vBox.addWidget(self.le)
     
     
            myW.setLayout(self.vBox)
            self.le.setFocus()
     
     
        def addItem(self):
            sender=self.sender()
            print("entree:",sender.objectName(), self.le.text())
            #print(self.c.currentCompletion(), self.c.currentRow())
            #if sender.objectName() =="completer":
            self.lw.addItem(self.le.text())
            self.le.clear()
     
            #self.c.disconnect()
     
            print("sortie:",sender.objectName(), self.le.text())
     
    if __name__ == '__main__':
     
        app =QApplication(sys.argv)
        test = Principal()
        test.show()
        sys.exit(app.exec_())
    Une fois la sélection faite dans le Qcompleter (completer.activated.connect(additem)
    Pour remettre à blanc le LineEdit il faut cliquer sur le petit "clearbutton" à droite.
    La fonction additem fait efface bien le texte du LineEdit mais il reste toujours visible.
    La seule façon que j'ai trouvée pour faire disparaitre le texte du LineEdit c'est de faire un completer.disconnect(),
    mais comment reconnecter le completer si c'est la seule solution?
    comment faire cette remise à blanc sans être obligé de cliquer sur un bouton ?
    j'ai essayé de jour avec les signaux du LineEdit en émettant un signal editingfinished ou returnpressed mais aucun résultats.
    Merci de votre aide.
    Ubuntu 22.04.1 LTS
    LibreOffice 7.4.3

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai essayé ton code, et je trouve qu'il marche bien, aussi je ne comprends pas bien ton problème.

    - Au lancement, la ligne de saisie affiche une invite "Recherche ....".
    - Si je tape la 1ère lettre d'un fichier présent dans le répertoire, le petit menu de complétion s'affiche avec les fichiers qui correspondent. Si je sélectionne l'un de ces fichiers dans le menu, son nom s'affiche dans la ligne de saisie, et aussi dans le QListWidget .
    - Et si je clique sur la croix à droite de la ligne de saisie, elle s'efface et ré affiche l'invite "Recherche ....".

    Qu'est-ce qui ne te parait pas bien?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre du Club Avatar de ptissendier
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 64
    Points : 53
    Points
    53
    Par défaut
    Bonjour Tyrtamos,
    Merci de ta réponse.
    Dans mon code le self.le.clear() se fait bien les 2 print en témoignent.
    mais en "affichage" on a toujours le nom du fichier choisi, qu'il faut effacer en cliquant sur le ClearButton, LineEdit ne se "réinitialise" pas.
    donc voià j'aimerai que après que le choix soit affiché dans la listview, le lineedit soit remis à blanc et repositionné en saisi (comme à l'ouverture) sans avoir à cliquer sur le clearbutton.

    Je ne sais plus où chercher , signal et slot, keypress, ....
    Ubuntu 22.04.1 LTS
    LibreOffice 7.4.3

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je n'ai pas encore testé, mais je suggère d'essayer cela:

    - récupérer le signal qui est émit quand un nouveau texte arrive sur le QListWidget et lancer une nouvelle méthode "effaceligne" (par exemple)

    - dans cette méthode et avec le QLineEdit, faire la sélection du mot complet avec ".selectAll()" et faire un nouvel affichage avec .setText("").
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre du Club Avatar de ptissendier
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 64
    Points : 53
    Points
    53
    Par défaut
    Désolé ça ne marche pas.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    import os, sys
    from PyQt5.QtGui import QStandardItemModel,QStandardItem
    from PyQt5.QtCore import QStringListModel,pyqtSignal
    from PyQt5.QtWidgets import (QApplication,QWidget,QVBoxLayout,
                        QLayout,QLineEdit,QCompleter,
                        QListWidget,QMainWindow)
     
     
    class Principal(QMainWindow):
     
        def __init__(self):
            super().__init__()
     
            myW=QWidget()
            self.setCentralWidget(myW)
            self.setGeometry(500,500,400,200)
            self.setWindowTitle('Test completer.activated')
     
            maliste=os.listdir("/usr/share/applications/")
            slm = QStringListModel()
            slm.setStringList(maliste)
     
            self.c = QCompleter()
            self.c.setCaseSensitivity(0)
            self.c.setObjectName("completer")
            self.c.setModel(slm)
     
     
            self.le = QLineEdit()
            self.le.setPlaceholderText("Recherche ....")
            self.le.setClearButtonEnabled(True)
            self.le.setObjectName("LineEdit")
            self.le.setCompleter(self.c)
            #self.le.editingFinished.connect(self.addItem)
            #self.le.returnPressed.connect(self.addItem)
            self.c.activated.connect(self.addItem)
            self.c.activated.connect(self.clearle)
     
            self.lw=QListWidget()
            self.lw.setStyleSheet("background-color:LightGrey")
     
            self.vBox=QVBoxLayout()
            self.vBox.addWidget(self.lw)
            self.vBox.addWidget(self.le)
     
     
            myW.setLayout(self.vBox)
            self.le.setFocus()
     
     
        def addItem(self):
            print("entree le.text>", self.le.text())
     
            self.lw.addItem(self.le.text())
            print("sortie le.text>",self.le.text())
     
        def clearle(self):
            print("clearle in")
            self.le.selectAll()
            self.le.setText("")
            print("clearle out",self.le.text())
     
     
     
     
     
     
     
    if __name__ == '__main__':
     
        app =QApplication(sys.argv)
        test = Principal()
        test.show()
        sys.exit(app.exec_())
    on dirait qu'on perd le controle du lineedit .... mais non puisque le lineedit.text s'efface bien.
    Ubuntu 22.04.1 LTS
    LibreOffice 7.4.3

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Il ne faut pas prendre un signal du qcompleter mais du qlistwidget! Sinon il y a conflit, puisque la sélection sur le menu de complétion va déclencher en même temps l’affichage et l’effacement du qlineedit.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre du Club Avatar de ptissendier
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 64
    Points : 53
    Points
    53
    Par défaut
    Je ne vois pas quel signal du qlistview je peut tester, il ne possède que des signaux relatifs aux items.
    Si je fais un self.lw.activated.connect.(self.le.clear) ça marche si je doubleclique sur un item, ce n'est pas le but recherché.
    Dans les signaux du QlineEdit je ne vois que editingFinished qui pourrait convenir, mais si je fais self.le.editingFinished.emit() et self.le.editingFinished.connect(self.le.clear) ça ne marche pas

    Petites pistes .... si je réduit l'application (bouton - dans la barre de titre) et que je la ré-ouvre le Qlineedit est bien réinitialisé, le contenu du Qlistview est conservé ....
    si je clique n'importe où dans le qlistview ou si j’appuie sur return ... ça le fait ! je vais essayer d'envoyer un keyPress, ou un click ...
    Ubuntu 22.04.1 LTS
    LibreOffice 7.4.3

  8. #8
    Membre du Club
    Homme Profil pro
    Responsable plancher d'essais et test final
    Inscrit en
    Octobre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable plancher d'essais et test final
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 29
    Points : 41
    Points
    41
    Par défaut
    Une solution trouvée a un problème identique est d'utiliser QTimer

    Importer QTimer depuis QtCore et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def add_item(self):
        self.lw.addItem(self.le.text())
        QTimer.singleShot(0, self.le.clear)

  9. #9
    Membre du Club Avatar de ptissendier
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 64
    Points : 53
    Points
    53
    Par défaut
    Merci ocornet,
    Problème résolu, mais s'il te plait peux-tu citer tes sources, j'ai quand même besoin de comprendre ainsi que Tyrtamos je pense.
    Encore merci
    Ubuntu 22.04.1 LTS
    LibreOffice 7.4.3

  10. #10
    Membre du Club
    Homme Profil pro
    Responsable plancher d'essais et test final
    Inscrit en
    Octobre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable plancher d'essais et test final
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 29
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par ptissendier Voir le message
    Merci ocornet,
    Problème résolu, mais s'il te plait peux-tu citer tes sources, j'ai quand même besoin de comprendre ainsi que Tyrtamos je pense.
    Encore merci
    La source c'est un post sur stackoverflow.
    L'explication serait que le signal 'activated' du QCompleter est déclenché avant d'assigner une valeur, au final le clear() fonctionne mais efface le QLineEdit quand il est encore vide.
    La solution est de faire le clear() un instant plus tard, et pour ça QTimer peut être utilisé.

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Merci! manifestement ça marche, et je n'ai pas trouvé d'autre solution.

    Au lieu d'effacer la ligne d'édition, on peut aussi sélectionner (en bleu) le nom choisi sur le menu de complétion. Ainsi, le nom reste visible, mais toute lettre tapée après le fera disparaître:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTimer.singleShot(0, self.le.selectAll)
    Petite faiblesse des solutions précédentes, si on tape complètement le nom de fichier sans le choisir sur le menu de complétion, ce nom n'est pas ajouté au QListWidget. Pour ça, il faut ajouter la fonction addItem à déclencher avec la touche "entrée". Il suffit de dé-commenter la ligne qui existe déjà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.le.returnPressed.connect(self.addItem)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  12. #12
    Membre du Club Avatar de ptissendier
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 64
    Points : 53
    Points
    53
    Par défaut
    Merci tyrtamos pour le test et le returnpressed

    Pour le lineedit clear la deuxième solution avec le type de connexion marche bien aussi et est peut-être un peu plus "élégante"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            self.c.activated.connect(self.clearle,type=Qt.QueuedConnection)
    Encore merci
    Ubuntu 22.04.1 LTS
    LibreOffice 7.4.3

  13. #13
    Membre du Club
    Homme Profil pro
    Responsable plancher d'essais et test final
    Inscrit en
    Octobre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable plancher d'essais et test final
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 29
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Merci! manifestement ça marche, et je n'ai pas trouvé d'autre solution.
    Tyrtamos,

    J'avais vérifié que cette solution fonctionnait avant de la proposer

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

Discussions similaires

  1. refresh avec url complete, debutant
    Par Mobistar dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/12/2007, 10h48
  2. [SQL2K]Requete sur une chaine avec une ou plusieurs quote
    Par tazamorte dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/04/2007, 08h22
  3. Select et insert avec des caracteres speciaux (quote ')
    Par Paco75 dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/10/2006, 14h59
  4. Probleme avec encodage de simple quote
    Par linkowich dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2005, 13h16
  5. Réponses: 3
    Dernier message: 30/06/2005, 12h50

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