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 :

Check box dans une QListWidget et un filtre


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Par défaut Check box dans une QListWidget et un filtre
    Bonjour,

    Je suis nouveau sur la programmation en PYQT5, ainsi j'aurais aimé une aide,

    je chercher à faire une QListWidget à l’intérieur il y'a que des checkbox, ainsi qu'un filtre qui me permet de faire une recherche parmi les items dans la QListWidget.

    voici le code que j'ai pu faire :

    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
     
     
    import sys
    from PyQt5.QtCore import QDate, QSize, Qt
    from PyQt5.QtGui import *
    from PyQt5 import QtWidgets,QtCore
     
    class Test(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(Test, self).__init__(parent)
            self.layout = QtWidgets.QVBoxLayout()
            self.listWidget = QtWidgets.QListWidget()
            self.listWidget.itemEntered.connect(lambda item: item.setCheckState(Qt.Checked if item.checkState()==Qt.Unchecked else Qt.Unchecked))
            self.listWidget.setGeometry(QtCore.QRect(10, 10, 211, 291))
            for i in range(10):
                item = QtWidgets.QListWidgetItem("Item %i" % i)
                item.setCheckState(Qt.Unchecked)
                self.listWidget.addItem(item)
            self.listWidget.itemClicked.connect(self.printItemText)
     
            self.layout.addWidget(self.listWidget)
            self.setLayout(self.layout)
     
        def printItemText(self):
            items = self.listWidget.selectedItems()
            print (self.listWidget.itemClicked)
            for i in range(len(items)):
                print (str(self.listWidget.selectedItems()[i].text()))
     
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        form = Test()
        form.show()
        app.exec_()
    les problèmes auxquels je suis confronté sont:

    -je n'arrive pas à savoir quelle checkbox est sélectionnée, à terme je cherche à remplir une liste avec les items sélectionnées ("il faut prendre en compte ceux qui ont changé d'état")

    -un filtre qui me permet de chercher rapidement un item, IMPOSSIBLE de trouver quoi que ce soit sur internet :/



    je vous remercie d'avance pour vos réponses

  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 programme de test pour source d'inspiration sur le sujet:

    A noter que la méthode "modifcoche", ne fait qu'afficher en console à chaque modif de la coche d'une case, et ne sert qu'à la mise au point. L'utilisation normale est de rentrer la liste des items au lancement du dialogue, et de sortir la liste modifiée à la fermeture du dialogue.

    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
    76
    77
    78
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
     
    ##############################################################################
    class Test(QtWidgets.QDialog):
     
        #=========================================================================
        def __init__(self, listitems=[], parent=None):
            super().__init__(parent)
     
            self.listWidget = QtWidgets.QListWidget()
     
            for check, item in listitems:
                qitem = QtWidgets.QListWidgetItem()
                qitem.setText(item)
                qitem.setCheckState(QtCore.Qt.Checked if check else QtCore.Qt.Unchecked)
                self.listWidget.addItem(qitem)
     
            # optionnel
            self.listWidget.itemClicked.connect(self.modifcoche)
     
            # crée les boutons pour terminer le dialogue
            boutons = QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel
            self.boutonbox = QtWidgets.QDialogButtonBox(boutons)
            self.boutonbox.accepted.connect(self.accept) # => bouton "Ok"
            self.boutonbox.rejected.connect(self.reject) # => bouton "Annuler"
     
            # positionner les widgets dans la fenêtre de dialogue
            layout = QtWidgets.QGridLayout()
            layout.addWidget(self.listWidget, 0, 0)
            layout.addWidget(self.boutonbox, 1, 0)        
            self.setLayout(layout)
     
        #=========================================================================
        def modifcoche(self, qitem):
            """appelé à chaque modification d'un checkbox avec pour paramètre le 
               QListWidgetItem concerné
            """
            ligne = qitem.listWidget().row(qitem)
            item = qitem.text()
            coche = True if qitem.checkState()==QtCore.Qt.Checked else False        
            print("ligne:", ligne, "item:", item, "=>", coche)
     
        #=========================================================================
        def resultat(self):
            """retourne la liste résultat [[check, item], ...]
            """
            self.result = []
            for i in range(0, self.listWidget.count()):
                qitem = self.listWidget.item(i)
                coche = True if qitem.checkState()==QtCore.Qt.Checked else False
                item = qitem.text()
                self.result.append([coche, item])
            return self.result
     
    ##############################################################################
    if __name__ == "__main__":
     
        app = QtWidgets.QApplication(sys.argv)
     
        # données d'entrée
        listitems = [[True, "item0"], [False, "item1"], [False, "item2"], [True, "item3"], [True, "item4"], ]
     
        # appel dialogue
        form = Test(listitems)
     
        # exécution du dialogue et résultats
        if form.exec_():
            resultat = form.resultat()
            print()
            for check, item in resultat:
                print(check, item)
        else:
            print()
            print("Annulation")

  3. #3
    Membre du Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Par défaut
    je vous remercie, cela va beaucoup m'aider, c'est exactement ce que je vaux faire à terme.

    en ce qui concerne les filtres, si tu as des idées n’hésite pas

    MERCI ENCORE

  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
    Il faut m’en dire un peu plus sur le filtre que tu veux, et ce que tu veux en faire. Il y a beaucoup de possibilités.

  5. #5
    Membre du Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Février 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Février 2019
    Messages : 9
    Par défaut
    En fait je chercher a faire une bar de recherche qui me permet de en tapant un début de mot, de sélectionner dans une liste les mots qui correspondent ,

    J'ai trouvé une vidéo sur youtube qui illustre mes propos mais ce n'est pas en python.


  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
    Bonjour,

    Voilà quelques solutions pour la recherche des mots d'une liste satisfaisant une condition.

    D'abord, il y a une fonction à créer pour ne pas tenir compte de la casse (majuscule/minuscules) ni des accents (ici avec unicode uniquement):

    - pour la casse: on fait les comparaisons en mettant en majuscules le mot et la cible avec la méthode ".upper()".

    - pour les accents, on utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from unicodedata import normalize, combining
     
    def supaccents(chaine):
        """Supprime les accents de la chaine de caractères (unicode uniquement)
           utilise normalize et combining du module unicodedata
        """
        chnorm = normalize('NFKD', chaine)
        return "".join([car for car in chnorm if not combining(car)])
    Pour l'exemple, on va chercher dans une liste de prénoms comme (j'ai cherché dans https://nominis.cef.fr/contenus/pren...betique/A.html):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = ["Adèle", "Béatrice", "Candice", "Delphine", "Eléanor", "Fabien", "Gérard", "Hélène"]
    Et voilà quelques solutions de recherche:

    1- Recherche des mots de la liste commençant par la cible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cible = "elea"
     
    cible = supaccents(cible.upper())
    for mot in liste:
        if supaccents(mot.upper()).startswith(cible):
            print(mot)
    # résultat: Eléanor
    2- Recherche des mots de la liste contenant la cible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cible = "elea"
     
    cible = supaccents(cible.upper())
    for mot in liste:
        if cible in supaccents(mot.upper()):
            print(mot)
    # résultat: Eléanor
    3- Recherche des mots de la liste satisfaisant un motif 'wildcard'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from fnmatch import fnmatchcase
     
    cible = "*ean*"
     
    cible = supaccents(cible.upper())
    for mot in liste:
        if fnmatchcase(supaccents(mot.upper()), cible):
            print(mot)
    # résultat: Eléanor
    4-Recherche des mots de la liste satisfaisant un motif 'expression régulière'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import re
     
    cible = r"^.*ea.*or$"
     
    cible = supaccents(cible)
    regex = re.compile(cible, re.IGNORECASE)
    for mot in liste:
        if regex.match(supaccents(mot))!=None:
            print(mot)
    # résultat: Eléanor
    5- Recherche des mots de la liste ressemblant à la cible (avec un ratio mini de ressemblance)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from difflib import SequenceMatcher
     
    cible = "leanar"
    ratio = 0.75
     
    cible = supaccents(cible.upper())
    for mot in liste:
        if SequenceMatcher(None, supaccents(mot.upper()), cible).ratio() >= ratio:
            print(mot)
    # résultat: Eléanor
    Il n'y a plus qu'à choisir la méthode qui convient le mieux à ton problème...

Discussions similaires

  1. [XL-2003] Check Box dans une cellule
    Par juju1988 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/09/2010, 11h59
  2. Réponses: 15
    Dernier message: 01/07/2008, 15h12
  3. [JTable] Check Box dans une cellule
    Par kkajout dans le forum Composants
    Réponses: 4
    Dernier message: 19/05/2008, 10h55
  4. Check box dans une JTable
    Par Mischka dans le forum Composants
    Réponses: 1
    Dernier message: 24/07/2007, 13h58
  5. inclure un check box dans une table
    Par krikete13 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 03/06/2007, 13h46

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