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 :

Sélections multiples dans un QTreeView


Sujet :

Qt

  1. #1
    Membre confirmé Avatar de sylvain1984
    Homme Profil pro
    Retraité, développeur amateur
    Inscrit en
    Juillet 2023
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité, développeur amateur

    Informations forums :
    Inscription : Juillet 2023
    Messages : 59
    Par défaut Sélections multiples dans un QTreeView
    Bonjour !

    J'ai un soucis avec un QTreeView.

    Celui-ci contient au premier rang une liste de villes. Chaque ville contient une liste de dates :
    Nom : Screenshot_20250323_163252.png
Affichages : 69
Taille : 5,8 Ko
    Je veux pouvoir sélectionner plusieurs villes et dates pas forcément contiguës.

    J'aimerais le comportement suivant :
    • si je sélectionne une ville toutes les dates sous cette ville sont sélectionnées ;
    • si je désélectionne une ville toutes les dates sous cette ville sont désélectionnées ;
    • si je sélectionne une date alors la ville est également sélectionnée (pour indiquer une sélection quand la branche est repliée).
    • si je désélectionne la seule date sélectionnée d'une ville alors la ville est également désélectionnée.


    Je n'ai pas trouvé ce comportement dans les options disponibles. Par programmation, ça passe très bien sauf dans un cas : lorsqu'on fait glisser la souris clic, gauche maintenu, sur l'arbre il y a alors plusieurs sélections que je ne peux pas traiter.

    Voici mon code :
    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
    void CommandesTabs::on_treeView_filtre_collectes_clicked(const QModelIndex &index){
        QTreeView           * tv        = ui->treeView_filtre_collectes;
        QAbstractItemModel  * model     = tv->model();
        auto                  selection = tv->selectionModel()->selectedRows();
     
        if (index.isValid()){
            QModelIndex father;
            int childs;
            bool b = false;
     
            QString s = tv->selectionModel()->currentIndex().data().toString();
     
            if (! is_histos(s)){ // L'indexe courant est un parent, soit le nom d'une ville
     
                childs = model->rowCount(index);
     
                if (selection.contains(index)){ // Le parent est sélectionné --> sélectionner tous les enfants
                    while (childs--)
                        tv->selectionModel()->select(model->index(childs,0,index),QItemSelectionModel::Select);
                }else{                          // Dé-séléctionner tous les enfants
                    while (childs--)
                        tv->selectionModel()->select(model->index(childs,0,index),QItemSelectionModel::Deselect);
                }
     
            }else{               // L'indexe courant est un enfant, soit une date
                father = model->parent(index);
                childs = model->rowCount(father);
     
                for (int i=0 ; i<childs; i++)
                    b |= selection.contains(index.sibling(i,0));
     
                // Sélection du parent s'il y a un enfant sélectionné
                if (!b) tv->selectionModel()->select(father,QItemSelectionModel::Deselect);
                else  tv->selectionModel()->select(father,QItemSelectionModel::Select);
            }
            selection = ui->treeView_filtre_collectes->selectionModel()->selectedRows(); // Mise à jour des éléments sélectionnés pour traitements ultérieurs
        }
    Par ailleurs, je ne sais pas comment utiliser l'API des QAbstractItemModel pour parcourir un arbre de façon récursive.
    Quelqu'un a déjà fait ça ?

    Merci !
    Sylvain

  2. #2
    Membre confirmé Avatar de sylvain1984
    Homme Profil pro
    Retraité, développeur amateur
    Inscrit en
    Juillet 2023
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité, développeur amateur

    Informations forums :
    Inscription : Juillet 2023
    Messages : 59
    Par défaut
    Après recherches, il fallait utiliser le QItemSelectionModel (= QISM) du QTreeView (= QTV) (méthode treeView->selectionModel()).

    Quand les sélections dans le QTV changent, QISM émet un signal qui transmet deux QItemSelection : celui des éléments sélectionnés et celui des éléments désélectionnés. Avec ça j'ai pu faire ce que je voulais.

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

Discussions similaires

  1. Sélection multiple dans un sous formulaire ?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2019, 01h05
  2. update multiple dans une meme colonne
    Par debdev dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/01/2006, 21h46
  3. [Débutant] Sélection multiples dans une Listbox
    Par eraim dans le forum Access
    Réponses: 4
    Dernier message: 15/10/2005, 03h21
  4. Enregistre résulat multiplication dans une table
    Par faranfasi dans le forum Access
    Réponses: 2
    Dernier message: 11/10/2005, 13h04
  5. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34

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