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 :

Glisser-déposer entre deux QTableWidget


Sujet :

Qt

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut Glisser-déposer entre deux QTableWidget
    Bonjour,

    je dispose de 2 QTableWidgets, tableIN et tableOUT.

    Pour l'instant, j'arrive sans problème à déplacer des lignes d'une table à l'autre par deux QPushButtons [->] et [<-] : Copie des lignes dans la table cible, reclassement et resélection dans la table cible, destruction dans la table source.

    Le problème est que j'aimerais faire cela par Drag on Drop. Pour cela il faudrait que j'en comprenne le mécanisme. Je parcours des docs mais sans pouvoir synthétiser les étapes -et pire-, ni les automatismes. Autorisation, visualisation au niveau du curseur et pour l'action quels sont les éléments à surcharger si nécessaire ?

    Le code minimum semble être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ui->tableIN->setDragEnabled(true);
     ui->tableIN->setAcceptDrops(true);
     ui->tableIN->setDropIndicatorShown(true);
     ui->tableOUT->setDragEnabled(true);
     ui->tableOUT->setAcceptDrops(true);
     ui->tableOUT->setDropIndicatorShown(true);
    Il "autorise" le DnD entre les 2 tables. Mais le Drop laisse à désirer : il copie ce qui est sélectionné dans l'autre table, si l'équivalent du nombre de lignes sélectionnées dans la source est déjà créé dans la destination : autrement dit, si je veux déplacer 3 lignes d'un coup, il faut que 3 lignes vides existent dans la cible... tt si on effectue le lâcher exactement sur la première ligne vide. Je ne comprends pas bien ce genre de positionnement : Ou par défaut on propose un mécanisme fonctionnel, ou on ne propose rien.

    • Il me manque quoi pour que cela fonctionne ? Des lignes de paramétrage comme celles de dessus ? Peu probable mais on ne sait jamais... Noël approche.
    • Ou faut-il intervenir à la main ? C'est probable, mais dans ce cas, où neutralise-t-on le comportement par défaut (la création de lignes dans la cible, la pseudo-copie ? ) et où incorpore-t-on le sien (la création des lignes nécessaires, leur incorporation, le tri, leur sélection dans la table cible bref le code de mon QPushButton) ? Avec un peu de chance au même endroit



    Merci.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Bon,
    j'ai réglé le problème en promouvant mes QTableWidgets et en surchargeant les Events.
    Je ne sais pas s'il y a moyen de faire de manière plus simple (plus automatique) mais cela fonctionne ainsi.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 252
    Points : 272
    Points
    272
    Par défaut
    Bonjour,

    j'ouvre à nouveau la discussion pour simplifier mon code et mon approche.

    On peut utiliser le Dnd sur 2 tables en utilisant les propriétés des QTableWidgets (ici de taSrc vers taDst)
    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
       ui->setupUi(this);
       ui->taSrc->resize(250, 200);
       ui->taSrc->move(10,50);
       ui->taSrc->setEditTriggers( QAbstractItemView::NoEditTriggers );
       ui->taSrc->setSelectionBehavior( QAbstractItemView::SelectRows );
       ui->taSrc->setSelectionMode( QAbstractItemView::ExtendedSelection );
       ui->taSrc->setAlternatingRowColors(true);
       ui->taSrc->viewport()->setAcceptDrops(false);
       ui->taSrc->setDragEnabled(true);
       ui->taSrc->setDropIndicatorShown(true);
       ui->taSrc->setDragDropMode( QAbstractItemView::DragOnly );
       ui->taSrc->setDefaultDropAction( Qt::MoveAction );
       ui->taSrc->setDragDropOverwriteMode(false);
       ui->taSrc->setColumnCount( 2 );
       for (int nRow = 0; nRow < 4; nRow ++) {
           ui->taSrc->insertRow(nRow);
           for (int nCol = 0; nCol < 2; nCol ++) {
              ui->taSrc->setItem( nRow, nCol , new QTableWidgetItem( "Cell " + QString::number(nRow) + "." + QString::number(nCol ) ));
           }
       }
     
       ui->taDst->resize(250, 200);
       ui->taDst->move(340, 50);
       ui->taDst->setEditTriggers( QAbstractItemView::NoEditTriggers );
       ui->taDst->setSelectionBehavior( QAbstractItemView::SelectRows );
       ui->taDst->setSelectionMode( QAbstractItemView::ExtendedSelection );
       ui->taDst->setAlternatingRowColors(true);
       ui->taDst->setColumnCount( 2 );
       ui->taDst->viewport()->setAcceptDrops(true);
       ui->taDst->setDragEnabled(true);
       ui->taDst->setDropIndicatorShown(true);
       ui->taDst->setDragDropMode( QAbstractItemView::DropOnly );
       ui->taDst->setDefaultDropAction( Qt::MoveAction );
       ui->taDst->setDragDropOverwriteMode(false);
    Le problème, c'est la réversibilité. Pour que cela fonctionne dans un sens, il faut paramétrer la taSrc et la taDst de manière différentes. Lorsque je veux utiliser le DnD dans l'autre sens, évidemment avec les paramétrages initiaux, cela ne fonctionne pas. Je me suis dit qu'on pouvait les modifier de manière dynamique, mais pour l'instant "impossible". Je cherche encore un peu parce que franchement le code ci-dessus est d'une simplicité vraiment intéressante par rapport à mon autre approche, certes fonctionnelle mais nettement plus verbeuse.

    Une idée ? Merci.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/11/2014, 11h36
  2. Glisser-déposer entre QWidget différents
    Par EvaBraun dans le forum Débuter
    Réponses: 1
    Dernier message: 24/11/2012, 10h59
  3. Glisser-déposer entre deux QTreeView
    Par sfarc dans le forum Débuter
    Réponses: 21
    Dernier message: 16/05/2012, 10h59
  4. Glisser-déposer entre deux zones de listes
    Par Arkham46 dans le forum Contribuez
    Réponses: 2
    Dernier message: 13/04/2012, 12h20
  5. Glisser-déposer entre ListView
    Par Troudhyl dans le forum Qt Quick
    Réponses: 5
    Dernier message: 18/01/2012, 13h01

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