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

Discussion :

QTreeWidgetItem et relation parent-enfants

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut QTreeWidgetItem et relation parent-enfants
    Bonjour,

    J'ai un arbre (tree) avec plusieurs items (parents-enfants), chacun étant sélectionnable par une checkbox, exemple :

    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
     
    tree= new QTreeWidget;
          tree->setColumnCount(1);
     
    parent = new QTreeWidgetItem(tree);
            parent->setText(0, "Parent");
            parent->setFlags(parent->flags() | Qt::ItemIsUserCheckable);
            parent->setCheckState(0, Qt::Unchecked);
     
    enfant1 = new QTreeWidgetItem(parent);
            enfant1->setText(0, QString::fromUtf8("Enfant 1"));        
            enfant1->setFlags(enfant1->flags() | Qt::ItemIsUserCheckable);
            enfant1->setCheckState(0, Qt::Unchecked);
     
    enfant2 = new QTreeWidgetItem(parent);
    etc...
    Je cherche à modifier conjointement l'état des checkbox entre parent et enfants, c-à-d que un parent coché entraîne le même statut pour ses enfants, ou qu'un enfant décoché mette le parent en PartiallyChecked. Le SIGNAL/SLOT suivant fonctionne pour la première partie de ma demande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    connect(tree, SIGNAL(itemChanged(QTreeWidgetItem *, int) ), this, SLOT(bascule(QTreeWidgetItem *, int)));
     
    void FenPrincipale::bascule(QTreeWidgetItem * item, int col) {
     
        if (parent->checkState(0) == 2){
            enfant1->setCheckState(0, Qt::Checked);
            enfant2->setCheckState(0, Qt::Checked);
        }
    sauf que bien entendu dans ce cas les enfants ne sont plus décochables individuellement et qui faut que je remette le parent à Unchecked pour pouvoir avoir de nouveau la main sur ses enfants...

    Quelqu'un a-t-il une idée pour l'implémentation de la fonction 'bascule' ? car je sèche lamentablement...

    Merci et bonne fin de journée

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    La fonction "bascule()" est générique dans le sens où elle est censée marcher pour tout ce que tu créeras comme QTreeWidgetItem. Donc tu ne dois pas manipuler parent/enfant1 etc. mais uniquement le paramètre item, qui est l'item qui vient de changer. Ça donne quelque chose comme :

    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
    void FenPrincipale::bascule(QTreeWidgetItem * item, int col){
        if (item->checkState(0) == Qt::Checked) {
            // on s'occupe de l'éventuel parent
            if (item->parent() != 0) {
                if (item->parent()->checkState(0) == Qt::Unchecked) {
                    if (item->parent()->childCount() > 1) {
                        item->parent()->setCheckState(0, Qt::Checked);
                    } else {
                        item->parent()->setCheckState(0, Qt::PartiallyChecked);
                    }
                } else if (item->parent()->checkState(0) == Qt::PartiallyChecked) {
                    // vérifier si tous les enfants sont cochés pour voir si on coche le parent ou pas
                }
            }
     
            // on s'occupe des éventuels enfants
            if (item->childCount() > 0) {
                // etc.
            }
        } else {
            // etc.
        }
    }
    Ceci dit, ça m'étonne que ce ne soit pas plus simple, vu que c'est un comportement très courant...

  3. #3
    Membre confirmé
    Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2011
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2011
    Messages : 114
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    La fonction "bascule()" est générique dans le sens où elle est censée marcher pour tout ce que tu créeras comme QTreeWidgetItem. Donc tu ne dois pas manipuler parent/enfant1 etc. mais uniquement le paramètre item, qui est l'item qui vient de changer.
    Merci beaucoup Troudhyl, ça marche super ! il fallait effectivement rester générique dans la fonction...

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

Discussions similaires

  1. Migration table Mysql avec relation parent/enfant
    Par danidan75 dans le forum Installation, migration et administration
    Réponses: 0
    Dernier message: 05/08/2011, 22h38
  2. Relation Parent/Enfant - Enfant/Parent
    Par zax-tfh dans le forum Services Web
    Réponses: 1
    Dernier message: 02/03/2010, 17h30
  3. Réponses: 1
    Dernier message: 23/11/2007, 12h04
  4. Réponses: 1
    Dernier message: 27/07/2007, 08h45
  5. relation Parent/Enfant sur la meme table et requete SQL
    Par tatayoyo dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/04/2007, 18h57

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