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 :

QListWidget : intervertir des items


Sujet :

PyQt Python

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

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut QListWidget : intervertir des items
    Bonjour,

    je développe actuellement une IHM où je voudrais faire la chose suivante:
    - afficher une liste d'items,
    - permettre à l'utilisateur de changer à sa guise l'ordre des items, mais sans en supprimer ni en ajouter.

    Pour cela j'ai créé un widget QListWidget et j'ai configuré la propriété "movement" à "free". Cependant cela n'a pas le comportement que je souhaite, lorsque je fais un "drag n' drop" pour bouger un item, il est dupliqué et non déplacé.
    Quelqu'un pourrait-il m'indiquer si je que je souhaite est possible et comment le faire? J'aimerais éviter de devoir ajouter des boutons "haut" et "bas" à côté du QListWidget pour bouger les éléments, mais plutôt utiliser le drag 'n drop.

    Merci d'avance pour votre aide!

  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,

    La propriété movement n'est pas nécessaire ici, tu dois réimplémenter le drag&drop de la vue.

    Etant donné qu'il faut aussi réimplémenter les évènements liés à cette action, par facilité, je te recommande de réimplémenter le widget lui-même.

    Par exemple:
    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
     
    class ListWidget(QListWidget):
        def __init__(self, parent=None):
            super(ListWidget, self).__init__(parent)
            # ... 
            self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
            self.setDefaultDropAction(QtCore.Qt.MoveAction)
            self.setSelectionMode(QtGui.QAbstractItemView. ? )
            self.setSelectionMode(QtGui.QAbstractItemView. ? )
     
        def mouseMoveEvent(self, event):
            self.startDrag(event)
     
        def mousePressEvent(self, event):
            # Utile si tu veux appliquer une sélection particulière des objets
            QListWidget.mousePressEvent(self, event)
     
        def startDrag(self, event):
            if not self.selectedIndexes():
                return
     
            mimeData = QtCore.QMimeData()
            mimeData.setText("files")
            drag = QtGui.QDrag(self)
            drag.setMimeData(mimeData)
            # Eventuellement, tu places ici une icône de ton choix
            result = drag.start(QtCore.Qt.MoveAction)
            event.accept()
     
        def dragMoveEvent(self, event):
            if event.mimeData().hasText():
                event.setDropAction(QtCore.Qt.MoveAction)
                event.accept()
     
            else:
                event.ignore()
     
        def dropEvent(self, event):
            # Ici tu peux récupérer les infos mises dans mimeData, si utile
            QListWidget.dropEvent(self, event)
    Comme il s'agit d'un déplacement interne, tout n'est peut-être pas indispensable, il faudra de toutes façons adapter à ton contexte.

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

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Bonjour,

    merci pour ta réponse très complète,
    en mettant la propriété "DragDropMode" à "internal" j'obtiens le comportement voulu. Pour l'instant je ne suis que sous QtDesigner, je n'ai pas commencé le traitement derrière cette partie de l'IHM.
    Je ne sais donc pas encore précisément quels événements j'aurai besoin de réimplémenter mais je garde ton code de côté!

    Il y a une partie que je ne comprend pas bien, qu'est-ce que l'objet 'QMimeData"? En fait je ne vois pas trop ce que tu fais dans la méthode startDrag.

Discussions similaires

  1. [QtGui] Ordre des items d'un QListWidget après un QDropEvent interne
    Par mokochan dans le forum PyQt
    Réponses: 10
    Dernier message: 08/08/2013, 11h12
  2. [QtGui] [QListWidget] Ordre des items modifiés
    Par mokochan dans le forum PyQt
    Réponses: 9
    Dernier message: 29/07/2013, 10h36
  3. [VB.NET] Choisir les valeurs des items d'un combo box?
    Par Eithelgul dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/06/2004, 11h13
  4. [MFC] CListCtrl: colonnes fixes + tri des items
    Par bigboomshakala dans le forum MFC
    Réponses: 5
    Dernier message: 10/05/2004, 23h54
  5. Comment effacer des Items d'un TListView ?
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/11/2002, 11h19

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