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

  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"?

  7. #7
    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
    Non c'est bien un QListWidget, j'ai juste mis les options de QListView dont hérite QListWidget, et je n'ai pas mis les options QtDesigner pour QListWdget car il y a juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    currentRow: -1
    sortingEnabled: false

  8. #8
    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
    Bien. J'essai de refaire mon code d'essai en utilisant QtDesigner.

    Par ailleurs, tu peux voir dans le détail les paramêtres que Designer a mis sur ton QListWidget, en éditant le ".ui" après enregistrement, voire la version ".py" que pyui4 a fabriqué.

  9. #9
    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
    Exact ^^
    en tout cas je te remercie pour le temps que tu passes à m'aider sur mon problème!

  10. #10
    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
    Ça y est! Et ça marche avec QtDesigner. Voilà mes codes:

    fichier "test06_ui.ui" enregistré par QtDesigner:

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>Form</class>
     <widget class="QWidget" name="Form">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>300</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Form</string>
      </property>
      <layout class="QGridLayout" name="gridLayout_2">
       <item row="0" column="0">
        <layout class="QGridLayout" name="gridLayout">
         <item row="0" column="0">
          <widget class="QListWidget" name="lw"/>
         </item>
        </layout>
       </item>
      </layout>
     </widget>
     <resources/>
     <connections/>
    </ui>
    Dans Designer, j'ai mis simplement le QListWidget dans la fenêtre par l'intermédiaire d'un gridlayout, sans aucun paramètre changé.

    Transformation par pyuic4:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pyuic4 test06_ui.ui -o test06_ui.py
    Ce qui donne le fichier "test06_ui.py":

    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'test06_ui.ui'
    #
    # Created: Thu Aug 08 09:10:40 2013
    #      by: PyQt4 UI code generator 4.10.2
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName(_fromUtf8("Form"))
            Form.resize(400, 300)
            self.gridLayout_2 = QtGui.QGridLayout(Form)
            self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
            self.gridLayout = QtGui.QGridLayout()
            self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
            self.lw = QtGui.QListWidget(Form)
            self.lw.setObjectName(_fromUtf8("lw"))
            self.gridLayout.addWidget(self.lw, 0, 0, 1, 1)
            self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
     
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
     
        def retranslateUi(self, Form):
            Form.setWindowTitle(_translate("Form", "Form", None))
    Et voilà le programme principal qui importe le code précédent:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys, os
     
    from PyQt4 import QtCore, QtGui
    from test06_ui import Ui_Form
     
    #############################################################################
    class Fenetre(QtGui.QWidget, Ui_Form):
     
        # =======================================================================
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.setupUi(self)
     
            self.setWindowTitle('Drag & Drop sur une QListWidget')
     
            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)
     
        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_()
    Et, chez moi, ça donne exactement le même résultat correct.

    A voir maintenant la comparaison des paramètres du QListWidget avec tes propres codes.

  11. #11
    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
    ça marche! \o/

    J'ai commencé par tout remettre par défaut dans QtDesigner pour mon QListWidget pour vraiment avoir la même chose que ton code, mais ça ne fonctionnait toujours pas.

    J'ai donc fini par éditer le fichier .ui et supprimer les propriétés appliquées à mon QListWidget (car dans QtDesigner, une fois qu'on a modifié une propriété, même si on la remet par défaut après, l'item XML reste dans le fichier *.ui).

    Et maintenant ça fonctionne sans problème... Du coup je n'ai pas trouvé quelle propriété exactement faisait que j'avais mon problème, mais le principal c'est que c'est résolu

    Merci beaucoup pour ton aide!

+ 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