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