Partage
  • Partager sur Facebook
  • Partager sur Twitter

Indexer QTreeWidgetItems

Sujet résolu
    18 mai 2019 à 23:14:17

    Bonsoir,

    Je me tourne vers vous car cela fait plusieurs jours que je piétine... Je fais un programme pour mon développement personnel. Il y aura au final plusieurs widgets d'apparences différentes mais presque tous héritent d'une classe de base (qu'on va appeler ici sobrement "Base"), elle même héritée de QDialog. Le but étant de remplir leur données et de les afficher dans un QDockWidget. J'ai donc pensé à stocker ces objets au fur et à mesure de leur création dans un QVector de "Base" et dans la foulée créer un QTreeWidgetItem avec comme texte un nom contenu dans ces objets. Je récupère ensuite avec un signal "clicked()" sur le QTreeWidget l'index de l'objet sélectionné et ça me l'affiche dans le QDockWidget. Tout fonctionne ! Ou presque (sinon je ne serais pas ici :lol:) Le problème que je rencontre est que j'ai un QTreeWidgetItem parent. (Le QVector contient donc tout les enfants...). Donc quand je clique sur l'item parent, cela m'affiche le premier widget enfant contenu à l'indice 0 du QVector.  Normal mon parent contient l'indice 0 également... 

    Sachant que j'aimerais que l'item parent contiennent éventuellement un autre widget que le widget de "Base"...      j'espère me faire comprendre :s

    Ma question étant donc :  Est-il possible d'indexer autrement les items ? Ou alors existe-t-il une autre méthode plus simple pour ce que je souhaiterais faire : en gros associer un widget à un item. C'est le seul moyen de faire que j'ai trouvé.

    Voici mon code (les parties utiles..) : 

    //Création du widgetParent et de l'item parent du QTreeWidget
    
    void MainW::on_actionAjouter_Parent_triggered()
    {
        ui->treeWidget->setColumnCount(1);
    
        widgetParent *widget_parent = new widgetParent;
        ui->dockWidget->setWidget(widget_parent);
        ui->dockWidget->show();
    
        if(widget_parent->exec() == QDialog::Accepted)
        {
            m_itemParent = new QTreeWidgetItem;
            widget_parent->setOptions();
            m_itemParent ->setText(0,widget_parent->getNom());
            ui->treeWidget->addTopLevelItem(m_itemParent);
            ui->dockWidget->close();
        }
    }
    
    //Création de l'item enfant et ajout d'un widget au QVector de "Base"...
    
    void MainW::on_actionAjouter_enfant_triggered()
    {
        WidgetEnfant *Widget_Enfant = new WidgetEnfant;
        ui->dockWidget->setWidget(Widget_Enfant);
        ui->dockWidget->show();
    
        if(Widget_Enfant->exec() == QDialog::Accepted)
        {
            Widget_Enfant->setOptions();
            QTreeWidgetItem *itemEnfant = new QTreeWidgetItem;
            itemEnfant->setText(0,Widget_Enfant->getNom());
            m_itemParent->addChild(itemEnfant);
            ui->treeWidget->expandItem(m_itemParent);
            m_listeBase.push_back(Widget_Enfant);
            ui->dockWidget->close();
        }
    }
    
    //Sélection de l'item...
    
    void MainW::on_treeWidget_clicked(const QModelIndex &index)
    {
        int indexItem = index.row();
        ui->dockWidget->setWidget(m_listeBase[indexItem]); //Affichage du contenu de la case du QVector. C'est à ce niveau la qu'est mon problème...
        ui->dockWidget->show();
    
    
        if(m_listeBase[indexItem]->exec() == QDialog::Accepted)
        {
            ui->treeWidget->currentItem()->setText(ui->treeWidget->currentColumn(),m_listeBase[indexItem]->getNom());
            ui->dockWidget->close();
        }
    }

    J'espère avoir été clair c'est pas trop mon point fort :lol:. Merci de votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2019 à 12:54:57

      up. besoin de vous svp..
      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2019 à 14:34:38

        Salut,

        Tu peux hériter de QTreeWidgetItem et faire ton association avec ton widget dans cette nouvelle classe. Au lieu d'ajouter des QTreeWidgetItem dans ton QTreeWidget, tu ajoutes des custom_item qui auront un pointeur vers ton widget associé.

        • Partager sur Facebook
        • Partager sur Twitter
          22 mai 2019 à 20:35:17

          Salut et merci pour ta réponse :)

          Du coup j'ai suivi ton conseil. J'ai hérité de QTreeWidgetItem, mis un widget en attribut et je lui ai mis comme constructeur :

          CustomItem::CustomItem(QWidget *widget): m_widget(widget)
             {
                
             }

          j'ai également rajouté une méthode pour docker le widget :

          void CustomItem::dockerWidget(QDockWidget *dock)
          {
             dock->setWidget(m_widget);
          }

          et du coup en reprenant l'ajout d'un item (l'enfant par exemple) :

          void MainW::on_actionAjouter_enfant_triggered()
          {
              WidgetEnfant *Widget_Enfant = new WidgetEnfant;
              ui->dockWidget->setWidget(Widget_Enfant);
              ui->dockWidget->show();
           
              if(Widget_Enfant->exec() == QDialog::Accepted)
              {
                  Widget_Enfant->setOptions();
                  CustomItem *itemEnfant = new CustomItem(WidgetEnfant);
                  itemEnfant->dockerWidget(ui->dockWidget);
                  itemEnfant->setText(0,Widget_Enfant->getNom());
                  m_itemParent->addChild(itemEnfant);
                  ui->treeWidget->expandItem(m_itemParent);
                  m_listeBase.push_back(Widget_Enfant);
                  ui->dockWidget->close();
              }
          }

          Ça marche presque. Les widgets sont bien associés aux items, mais le soucis que j'ai maintenant vient de la sélection. J'ai utilisé le slot :

          void on_itemClicked(QTreeWidgetItem *item, int colomn)
          {
              ui->dockWidget->show();
          }

          Du coup j'ai toujours le dernier item ajouté (donc le dernier widget associé) qui s'affiche dans le dock. J'ai creusé un peu mais je ne sais pas quoi mettre dans ce slot...




          -
          Edité par Tomytoms 22 mai 2019 à 20:37:18

          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2019 à 21:34:36

            T'as ajouté des CustomItem dans ton QTreeWidget donc tous les slots ou tu as des QTreeWidgetItem, tu peux les cast en CustomItem et faire cque tu veux avec.

            auto custom_item = static_cast&lt;customitem&gt;(item);</customitem>

            • Partager sur Facebook
            • Partager sur Twitter
              24 mai 2019 à 20:32:53

              J'ai trouvé une solution. Je me suis repenché sur mon code de base parce que ça me tracassais... Et en final La solution est toute bête. J'ai juste cherché si l'item sélectionné a un parent ou non, et j'affiche en fonction. On passe toujours à côté du plus simple en fait ! :lol: Voici ce que j'ai mis :

              //Création du widgetParent et de l'item parent du QTreeWidget
               
              void MainW::on_actionAjouter_Parent_triggered()
              {
                  ui->treeWidget->setColumnCount(1);
               
                  widgetParent *widget_parent = new widgetParent;
                  ui->dockWidget->setWidget(widget_parent);
                  ui->dockWidget->show();
               
                  if(widget_parent->exec() == QDialog::Accepted)
                  {
                      m_itemParent = new QTreeWidgetItem;
                      widget_parent->setOptions();
                      m_itemParent ->setText(0,widget_parent->getNom());
                      ui->treeWidget->addTopLevelItem(m_itemParent);
                      m_listeBase.push_back(widget_parent);
                      ui->dockWidget->close();
                  }
              }
               
              //Création de l'item enfant et ajout d'un widget au QVector de "Base"...
               
              void MainW::on_actionAjouter_enfant_triggered()
              {
                  WidgetEnfant *Widget_Enfant = new WidgetEnfant;
                  ui->dockWidget->setWidget(Widget_Enfant);
                  ui->dockWidget->show();
               
                  if(Widget_Enfant->exec() == QDialog::Accepted)
                  {
                      Widget_Enfant->setOptions();
                      QTreeWidgetItem *itemEnfant = new QTreeWidgetItem;
                      itemEnfant->setText(0,Widget_Enfant->getNom());
                      m_itemParent->addChild(itemEnfant);
                      ui->treeWidget->expandItem(m_itemParent);
                      m_listeBase.push_back(Widget_Enfant);
                      ui->dockWidget->close();
                  }
              }
               
              //Sélection de l'item...
               
              void MainW::on_treeWidget_clicked(const QModelIndex &index)
              {
                  int itemIndex = index.row();
              
                  if(ui->treeWidget->currentItem()->parent() == nullptr)
                  {
                      ui->dockWidget->setWidget(m_listeBase[itemIndex]);
                      ui->dockWidget->show();
                  }
              
                  else
                  {
                      itemIndex ++;
              
                      ui->dockWidget->setWidget(m_listeBase[itemIndex]);
                      ui->dockWidget->show();
                  }
              }

              Merci beaucoup pour ton aide quand même :) 

              -
              Edité par Tomytoms 24 mai 2019 à 20:34:22

              • Partager sur Facebook
              • Partager sur Twitter

              Indexer QTreeWidgetItems

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown