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

Bibliothèques tierces Python Discussion :

PyQt4: supprimer un item d'un QListWidget dans une autre fonction que celle où il a été créé


Sujet :

Bibliothèques tierces Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut PyQt4: supprimer un item d'un QListWidget dans une autre fonction que celle où il a été créé
    Bonjour,

    j'ai un problème pour supprimer un item d'un QListWidget, toutes les méthodes que j'ai essayées ne fonctionnent pas.

    J'ai une fonction qui sert à lire des options dans un fichier de conf et les afficher dans un QListWidget.
    A partir de la fenêtre d'affichage, l'utilisateur a accès à trois menus ajouter/supprimer/modifier qui s'ouvrent dans une nouvelle fenêtre(dialog). Les modifications de l'utilisateurs sont reportées dans le fichier de config. Une fois sa modification validée, il est ramené à la fenêtre d'affichage sur laquelle se trouve un bouton pour recharger cet affichage.
    J'aimerais qu'un clic sur ce bouton supprime l'item qui est affiché, en crée un nouveau dans lequel il affiche le contenu du fichier modifié.
    Toutes mes tentatives donnent un nouvel item qui s'affiche en dessous du premier, mais ne supprime pas celui-ci.


    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
     
    class MenuListing(QtGui.QDialog,):
    class MenuListing(QtGui.QDialog,):
        def __init__(self, parent = None):
            super(MenuListing, self).__init__(parent)
            self.ui = Ui_DialogList()
            self.ui.setupUi(self)
            print (flagmenu)
            self.chargeListing() #appel de la fonction qui sélectionne la bonne fonction d'affichage en fonction du menu sélectionné par l'utilisateur
            self.ui.pushButtonListAjout.clicked.connect(self.selectAjout)
            self.ui.pushButtonListSupp.clicked.connect(self.selectSupp)
            self.ui.pushButtonListMod.clicked.connect(self.selectMod)
            self.ui.pushButtonListRecharge.clicked.connect(self.suppItem)#pour recharger l'affichage, je supprime d'abord l'item...
            self.ui.pushButtonListRecharge.clicked.connect(self.chargeListing)#...puis j'appelle la fonction de sélection de l'affichage.
            self.ui.pushButtonListRet.clicked.connect(self.close)
     
        def suppItem(self): #devrait supprimer l'item affiché mais ne fonctionne pas
            item = self.ui.listWidget.takeItem(self.ui.listWidget.currentItem())
            self.ui.listWidget.removeItemWidget(item)
     
        def chargeListing(self): #sélectionne la bonne fonction d'affichage selon le menu sélectionné
            if flagmenu == 1 :
                self.listeUtil()
            elif flagmenu == 2 :
                self.listeSip()
            elif flagmenu == 3 :
                self.listeConf()
            elif flagmenu == 4 :
                self.listeIvr()
     
        def listeUtil(self):
            config = configparser.RawConfigParser()
            config.read(dossierCS + '/users.conf')
            user = 8500
            while config.has_section(str(user)) == True:
                for user in config.sections():
                    if user.startswith('8'):
                        item = QtGui.QListWidgetItem(self.ui.listWidget)
                        item.setText("Numero : "+user+"  Nom : "+config.get(user, 'fullname')+ \
                                     "  Mot de passe : "+config.get(user, 'secret'))
                user = int(user)+ 1
    Avez-vous une idée de l'erreur que je fais?
    Merci beaucoup.

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Normalement, self.ui.listWidget.removeItemWidget(item) n'est pas nécessaire. takeItem supprime l'objet.

    Si l'item n'est pas supprimé, mets un print dans ta fonction pour vérifier ce que retourne self.ui.listWidget.currentItem()

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Salut VinsS

    Merci de ton activité sur ce forum.

    j'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ui.listWidget.takeItem(self.ui.listWidget.currentItem())
    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ui.listWidget.takeItem()
    Mais aucune de ces solutions ne permet de supprimer l'item !

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Avec la deuxième ligne tu aurais dut avoir une erreur.

    Tu as essayé avec le print ? le seul problème que je vois est là.

    Un code que j'ai sous les yeux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        ....
        sel = self.list_viewer.selectedItems()
        for s in sel:
            self.list_viewer.takeItem(s)
    marche nickel.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    J'ai modifié le code que tu met en exemple comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        def suppItem(self):
            sel = self.ui.listWidget.selectedItems()
            print("sel")
            print(sel)
            for s in sel:
                self.ui.listWidget.takeItem(s)
                print("s")
                print(s)
    Le print(sel) renvoie une liste vide ( [] ), donc il n'entre pas dans la boucle for, il ne trouve aucun item..

    pourtant les items sont bien créés par mon autre fonction (et je les voient puisqu'ils sont affichés..)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        def listeUtil(self):
            config = configparser.RawConfigParser()
            config.read(dossierCS + '/users.conf')
            user = 8500
            while config.has_section(str(user)) == True:
                for user in config.sections():
                    if user.startswith('8') or user.startswith('4') or user.startswith('5') or user.startswith('6'):
                        item = QtGui.QListWidgetItem(self.ui.listWidget)
                        item.setText("Numero : "+user+"  Nom : "+config.get(user, 'fullname')+ \
                                     "  Mot de passe : "+config.get(user, 'secret'))
                user = int(user)+ 1

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

    J'ai déjà rencontré un problème qui ressemble à ça, que j'ai résolu en supprimant les lignes sélectionnées dans l'ordre inverse des numéros de ligne.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Bonjour tyrtamos,

    j'aimerais essayer ta solution, mais comment fais-tu cela?

    Merci beaucoup.

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    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 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par nilslauwers Voir le message
    j'aimerais essayer ta solution, mais comment fais-tu cela?
    Voilà le principe:

    Si lw est le QListWidget, lw.selectedItems() donne la liste des QListWidgetItem sélectionnés

    Pour chacun des QListWidgetItem de cette liste, par exemple son ième élément, on peut calculer son numéro de ligne avec lw.row(liste[i])

    comme c'est une liste, on peut la trier selon ses éléments, par exemple comme ça: tri des QListWidgetItem de la liste selon leur numéro de ligne et en ordre inverse:

    liste = sorted(liste, key=lambda v: lw.row(v), reverse=True)

    On peut maintenant supprimer les lignes sélectionnées dans l'ordre inverse avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    liste = self.lw.selectedItems()
     
    liste.sort(key=lambda v: self.lw.row(v), reverse=True)
     
    for elem in liste:
        self.lw.takeItem(self.lw.row(elem))
    Je viens d'essayer, et manifestement, ça marche.

  9. #9
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Si selectedItems() retourne une liste vide à quoi sert tout cela ?

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    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 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Si selectedItems() retourne une liste vide à quoi sert tout cela ?
    Si selectedItems() retourne une liste vide, c'est qu'on n'a sélectionné aucune ligne, auquel cas, vouloir en supprimer n'a pas de sens.

    Mais je n'ai peut-être pas compris tout le problème: pourquoi ne pas pouvoir sélectionner des lignes?

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    A rien, visiblement ..
    J'ai essayé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        def suppItem(self):
            liste = self.ui.listWidget.selectedItems()
            print(liste)
            liste.sort(key=lambda v: self.ui.listWidget.row(v), reverse=True)
            for elem in liste:
                print(elem)
                self.ui.listWidget.takeItem(self.listWidget.row(elem))
    mais le print(liste) me retourne quand même une liste vide!

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

    Le problème est avant ce code: comment sélectionnes-tu les lignes à supprimer?

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Je fais la sélection grâce à cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.ui.listWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
    mais ça ne sélectionne rien du tout!

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    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 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Cette instruction ne sélectionne rien: elle détermine seulement le MODE de sélection. Ici, elle permet de sélectionner plusieurs lignes.

    La sélection de plusieurs lignes est censée être faite en cliquant sur les lignes avec la souris, tout en gardant appuyée la touche Ctrl.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Oups, j'suis vraiment.. fatigué, désolé. En fait, cela fonctionne très bien.
    Existe t-il une méthode qui permettrait de sélectionner tous les items?

    Merci beaucoup!

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    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 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par nilslauwers Voir le message
    Existe t-il une méthode qui permettrait de sélectionner tous les items?
    Oui! => .selectAll()

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 50
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup tyrtamos

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/11/2014, 18h46
  2. Réponses: 6
    Dernier message: 05/09/2013, 19h20
  3. Réponses: 7
    Dernier message: 10/06/2009, 23h29
  4. Réponses: 5
    Dernier message: 27/11/2008, 18h34
  5. Ecrire dans une autre fenetre que celle de l'application
    Par aurelien59 dans le forum Windows
    Réponses: 3
    Dernier message: 15/05/2007, 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