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

Qt Discussion :

QTreeView Move item


Sujet :

Qt

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut QTreeView Move item
    Bonjour,

    J'utilise un treeview et j'aimerais bouger les items avec la souris (drag & drop).

    Avez-vous un bout de code? une piste?

    a+

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    bein personne ne peut m'aider?

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    bein personne ne peut m'aider?
    ben c'est le week end.

    http://www.developpez.net/forums/d50...p-qtreewidget/
    http://www.developpez.net/forums/d55...ypes-fichiers/

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    c'est vrai mais je suis en vacances (sur la fin sniff) c'est pour ca

    moi je veux juste bouger les elements de mon treeview mais interdire de creer un noeud la ou c'etait une feuille. C'est fou comme j'ai du mal à comprendre comment tout ca reagit dans Qt. On ne sait pas quelle methode fait quoi et quelles methodes on doit reimplementer pour que le truc marche.

    je vais reprendre mon exemple depuis 0 pour essayer de bien comprendre chaque étape. Les 2 liens que tu m'as donné ne me conviennent pas...

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    as tu regardé la doc?
    http://qt.developpez.com/doc/4.4/dnd/

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    j'ai tout lu ... et c'est difficile de faire un tree qui marche bien.
    en plus j'ai l'impression que niveau bug on est loin du sans faute :-(
    essaie de cocher "animate" pour le deploy/collapse des noeuds...
    et le "auto-expand" ne va plus marcher ....

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    j'ai tout lu ... et c'est difficile de faire un tree qui marche bien.
    en plus j'ai l'impression que niveau bug on est loin du sans faute :-(
    essaie de cocher "animate" pour le deploy/collapse des noeuds...
    et le "auto-expand" ne va plus marcher ....
    si tu peut mettre ton exemple, ca m'interrese.
    J'ai jamais essayé.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    QTreeView n'implémente pas déjà le drag and drop?

    http://qt.developpez.com/doc/4.4/qab...gdropmode-prop

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Par défaut
    salut!

    j'avais pose a peu pres la meme question, j'ai reussi a controller l'item du drag, mais pas encore le lieu du drop, malheureusement!
    voila ce que j'ai pour l'instant, si ca peut aider qqn:

    voila pour le .h:

    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
     
     
    class dragableQTreeWidget : public QTreeWidget{
     
        public:
            dragableQTreeWidget( QWidget* parent = 0 ); 
            bool dropMimeData(QTreeWidgetItem *parent, int index, const
                   QMimeData *data, Qt::DropAction action);
     
            QMimeData *mimeData(const QList<QTreeWidgetItem *> items) const;
     
        protected:
            void dragEnterEvent(QDragEnterEvent *e) { 
                dragableQTreeWidget *source = qobject_cast<dragableQTreeWidget  *>(e->source());
                QTreeWidgetItem *item = source->currentItem();
                cout << "nombre de colonnes " << item->columnCount() << endl;
                if(item->columnCount() == 1){//c'est un item parent  
                    e->ignore();
                }
                else{//c'est un item que l'on peut dragguer
                    e->accept();
                }
            }
     
            void dragMoveEvent(QDragMoveEvent *e) {
                e->accept();     
            }
     
            void dropEvent(QDropEvent *e){
                e->acceptProposedAction();
                e->setDropAction(Qt::MoveAction);
                dragableQTreeWidget *source = qobject_cast<dragableQTreeWidget  *>(e->source());
     
                QTreeWidgetItem *item = this->itemAt(e->pos());
     
                if(item->columnCount() == 1){
                    e->accept();
                }
                else {
                    e->ignore();
                }
            }
     
     };
    et le .cpp

    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
     
    dragableQTreeWidget::dragableQTreeWidget( QWidget* parent ) : QTreeWidget( parent )
    {
     
        setAcceptDrops( true );
        setDragEnabled( true );
        setDropIndicatorShown(true);
    }
     
    QMimeData *dragableQTreeWidget::mimeData(const QList<QTreeWidgetItem *> items) const
    {
        QByteArray ba;
        QDataStream ds(&ba, QIODevice::WriteOnly);
        for (int i=0;i<items.size();i++)
           ds << items.at(i)->text(0);
        QMimeData *md = new QMimeData;
        md->setData("foo/bar", ba);
        return md;
     
    }
     
    bool dragableQTreeWidget::dropMimeData(QTreeWidgetItem *parent, int index, const
                                                 QMimeData *data, Qt::DropAction action)
    {
     
        if(parent==NULL) return false;
        else {
            QByteArray ba = data->data("foo/bar");
            QDataStream ds(&ba, QIODevice::ReadOnly);
            while (!ds.atEnd()) {
                QString str;
                ds >> str;
                QTreeWidgetItem *newItem = new QTreeWidgetItem(parent);
                newItem->setText(0, str);
                newItem->setExpanded(false);
                newItem->setBackgroundColor(0, QColor(105, 105, 105));
                parent->insertChild(0, newItem);
           }
        }
        return true;
    }
    les seuls items que je peux drag et dropper ici sont des qtreewidgetitems avec 3colonnes et ils doivent rester dans la meme categorie (elle-meme un qtreewidgetitem). le drag marche nikel mais pas le drop, mais ca peut te donner une piste.

    si tu y arrives, je suis preneur

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    bon j'ai reussi :-) (avec beaucoup de retard)
    il y a un bug dans Qt aussi puisqu'il ne distingue pas le copy du move avec Qt::InternalMove

    il faut reimplementer les fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    virtual int columnCount ( const QModelIndex & parent = QModelIndex() ) const 
    virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const 
    virtual QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const
    virtual QModelIndex parent ( const QModelIndex & index ) const
    virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const
    Qt::ItemFlags flags(const QModelIndex &index) const
    Qt::DropActions supportedDropActions() const
    QStringList mimeTypes() const
    QMimeData * mimeData(const QModelIndexList &indexes) const
    bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
    bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() ) 	
    bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ) 
    bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() )

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    il y a un bug dans Qt aussi puisqu'il ne distingue pas le copy du move avec Qt::InternalMove
    Comment cela?

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    dropMimeData ne recoit jamais d'action copy, juste move.
    ce bug n'existe que avec InternalMove.

    cependant si on met dragdrop ca marche mais le default est un copy sauf si on appuie sur "pomme" (je suis sur mac) il fera le move.

    c'est normalement l'inverse, le default c'est le move, et le copy si on appuie sur alt.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    C'est un problème, mac only?

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    je ne sais pas si c'est mac only... à essayer !

  16. #16
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Avec le code du bug tracker sous windows (en 4.4.1 par contre), il n'y a pas de CopyAction qui apprait dans le terminal.

    Après je ne sais pas si c'est un bug puisque la doc dit : "only accepts move operations only from itself" . Ca semble indiquer qu'il ne peut pas recevoir de copyAction.
    En revanche, il est vrai que quand on fait Ctrl (windows) en même temps que le drag il y a l'icone copie (le petit carré avec un +) qui apparaît. Donc si le fait qu'on ne puisse pas copier n'est pas un bug, ça s'en est un (plus minime par contre).

Discussions similaires

  1. [PowerShell] Move-Item, LastWriteTime et Sed
    Par jeanbernard.weck dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/06/2012, 14h02
  2. changer couleur item d'un QTreeView
    Par jefmehdi dans le forum Qt
    Réponses: 10
    Dernier message: 29/07/2009, 09h23
  3. Tableau dans un item d'un QTreeView
    Par bidibulke dans le forum PyQt
    Réponses: 4
    Dernier message: 24/07/2009, 14h21
  4. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  5. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

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