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 :

Ordre des items d'un QListWidget après un QDropEvent interne [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut Ordre des items d'un QListWidget après un QDropEvent interne
    Bonjour,

    cette discussion fait suite à celle-ci, grâce à laquelle j'ai pu gérer l'évènement DropEvent sur un widget QListWidget. (Uniquement des drag'n'drop entre les éléments du QListWidget, pas de drop extérieurs).

    Dans ma fonction appelée lors du DropEvent, je souhaite simplement récupérer la liste des items avec leur nouvel ordre. Or voilà ce que j'obtiens:

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def dropListWidget(self, event):
        print "Contenu avant Drop"
        for i in range(self.ui.maListWidget.count()):
            print self.ui.maListWidget.item(i).text()
     
        QListWidget.dropEvent(self.ui.maListWidget, event)
     
        print "Contenu apres Drop"
        for i in range(self.ui.maListWidget.count()):
            print self.ui.maListWidget.item(i).text()
    Me renvoie, si par exemple j'ai deplacé "Item 1" de l'index 0 vers 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Contenu avant Drop
    Item 1
    Item 2
    Item 3
    Item 4
    Contenu apres Drop
    Item 1
    Item 2
    Item 3
    Item 1
    Item 4
    L'ancien emplacement de Item 1 est conservé (mais l'affichage sur l'IHM est correct), alors que je voudrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Contenu apres Drop
    Item 2
    Item 3
    Item 1
    Item 4
    Or je n'arrive pas à supprimer l'élément en trop puisque dans ma fonction je ne sais pas lequel correspond à l'emplacement d'origine et lequel correspond au nouvel emplacement...
    Quequ'un pourrait-il m'aider?
    Merci d'avance.

  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,

    Je ne trouve pas cette erreur (j'ai ajouté l'affichage comme toi à mon code précédent). Chez moi, le .count() donne le bon résultat, et l'affichage est correct.

    Une idée: ajoute après la ligne QtGui.QListWidget.dropEvent(...) la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QCoreApplication.processEvents()

  3. #3
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    Bizarre que j'ai l'erreur et pas toi, là je ne sais vraiment pas pourquoi car j'ai recopié ton code... j'ai testé avec processEvents() mais cela ne change rien!

    Comprends pas

  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,

    Pour être sûr: voilà mon code d'essai complet:

    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 -*-
    from __future__ import division
    # Python 2.7
     
    import sys
     
    from PyQt4 import QtCore, QtGui
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.setWindowTitle('Drag & Drop sur une QListWidget')
     
            self.lw = QtGui.QListWidget(self)
            self.datas = [u"toto1", u"toto2", u"toto3", u"toto4", u"toto5", u"toto6", u"toto7", u"toto8", u"toto9"]
            self.lw.addItems(self.datas)
     
            # détournement de la méthode dropEvent du QListWidget
            self.lw.dropEvent = self.dropEvent_lw
     
            # mode Drag&Drop sur le changement d'ordre (sans ajout ni effacement)
            self.lw.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.lw, 0, 0)
            self.setLayout(posit)
     
        def dropEvent_lw(self, event):
            """appelé à chaque modif d'ordre"""
            lw_item = self.lw.currentItem()
            lw_row = self.lw.row(lw_item)
            lw_data = lw_item.text()
     
            print u"avant:", self.lw.count(), u"items" 
            for i, row in enumerate(range(self.lw.count())):
                print i, self.lw.item(row).text()
     
            QtGui.QListWidget.dropEvent(self.lw, event)
     
            print u"après:", self.lw.count(), u"items" 
            for i, row in enumerate(range(self.lw.count())):
                print i, self.lw.item(row).text()
            print u"l'item", lw_data, u"est passé de l'index", lw_row, u"à l'index", self.lw.row(self.lw.currentItem())
            print
     
    #############################################################################
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        app.exec_()

  5. #5
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    Merci,
    quand je lance ton code ça marche bien, quand je le recopie dans mon code ça me refais l'erreur.
    Je me dis que ça vient peut-être d'une option de QListWidget que j'ai mal configuré dans QtDesigner?
    Voilà ce que j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [QWidget]
    acceptDrops: false
     
    [QAbstractItemView]
    showDropIndicator: true
    dragEnabled: false
    dragDropOverwriteMode: false
    dragDropMode: InternalMove
    defaultDropAction: IgnoreAction
     
    [QListView]
    movement: free
    Avant j'avais mis l'option "defaultDropAction" à "MoveAction" mais le résultat est le même.

  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
    Tu utilises un "QListView" et non un "QListWidget"?

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

Discussions similaires

  1. [QtGui] [QListWidget] Ordre des items modifiés
    Par mokochan dans le forum PyQt
    Réponses: 9
    Dernier message: 29/07/2013, 09h36
  2. Report 6i en format texte : ordre des items
    Par reppier dans le forum Reports
    Réponses: 2
    Dernier message: 17/03/2010, 09h34
  3. [Joomla!] Ordre des items dans un menu
    Par pseudo88 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 30/09/2009, 17h28
  4. Changer l'ordre des Items de Menu.
    Par Ivynox dans le forum C#
    Réponses: 3
    Dernier message: 29/11/2007, 15h49
  5. [Portal 9iAS] : ordre des items dans une région
    Par melitta dans le forum Oracle
    Réponses: 8
    Dernier message: 21/10/2004, 14h01

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