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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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.

  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,

    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?

  3. #3
    Membre confirmé 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
    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, ....

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

  5. #5
    Membre confirmé 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
    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.

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

+ 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