Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. French
  4. Sélections multiples dans un QTreeView
QtWS25 Last Chance

Sélections multiples dans un QTreeView

Scheduled Pinned Locked Moved Solved French
2 Posts 1 Posters 114 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Max
    wrote on 25 Mar 2025, 17:43 last edited by Max
    #1

    Bonjour !

    Je suis sous Linux-Debian à jour, Qt Creator 9.0.2, Qt 6.4.2 (GCC 12.2.0, x86_64).

    J'ai un soucis avec un QTreeView.

    Celui-ci contient au premier rang une liste de villes. Chaque ville contient une liste de dates :
    Screenshot_20250323_163252.png
    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 :

    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

    1 Reply Last reply
    0
    • M Offline
      M Offline
      Max
      wrote about 10 hours ago last edited by
      #2

      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.

      1 Reply Last reply
      0
      • M Max has marked this topic as solved about 10 hours ago

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved