Children unter Toplevel-Item durchsuchen (QTreeWidget)

Alles rund um die Programmierung mit Qt
Antworten
john_Ohlsen
Beiträge: 13
Registriert: 19. Januar 2006 16:57
Wohnort: München

Children unter Toplevel-Item durchsuchen (QTreeWidget)

Beitrag von john_Ohlsen »

Hallo,

ich habe ein Problem beim Durchsuchen meines treeWidget (QTreeWidget*). Ich habe einen QTreeWidget mit einem Toplevel-Item unter dem Children untergeordnet sind (Toplevel_Child.png).
Die Anforderung ist, das jedes Toplevel-Item nur einmal vorkommen darf. Aber auch die Children unter einem Toplevel-Item dürfen nur einmal vorkommen.
In dem folgdenden Code soll dieses Verhalten erstellt werden. Leider versagt der Code, wenn ein Child zu einem Toplevel-Item eingefügt werden soll und es schon ein Toplevel-Item mit dem gleichen Namen gibt (z.B. 'def', siehe Einfuegen_unter_Toplevel.png)

Code: Alles auswählen

void
MyTreeClass::updateTree(QString sTopLevelText, QString sChildText)
{
    QList<QTreeWidgetItem*> itemListTopLevel = ui.treeWidget->findItems(sTopLevelText,Qt::MatchExactly,0);

    if (itemListTopLevel.isEmpty()) //Wenn kein Toplevel-Item gefunden wurde, dann wird Toplevel mit Child neu angelegt.
    {
      QTreeWidgetItem* itemTopLevel = new QTreeWidgetItem(ui.treeWidget);

      itemTopLevel->setText(0, sTopLevelText); //TopLevel-Item angelegt.
  
      QTreeWidgetItem* itemChild = new QTreeWidgetItem(itemTopLevel);
    
      itemChild->setText(0, sChildText); //Child-Item angelegt.
    }
    else //Es wurde ein Toplevel-Item gefunden. Es wird der Versuch unternommen, alle children nach sChildText zu durchsuchen.
    {
      QTreeWidgetItem* itemTopLevel = itemList.at(0); //Es wird dem itemTopLevel das gefundene Toplevel-Item übergeben. 

	  QString test = itemTopLevel->text(0);

      QTreeWidget* treeWidgetTopLevel = itemTopLevel->treeWidget(); // Aus dem itemTopLevel wird ein QTreeWidget aufgebaut.

      QList<QTreeWidgetItem*> itemListChildren = treeWidgetTopLevel->findItems(sChildText,Qt::MatchExactly,0); //In itemListChildren sollten eigentlich nur die Items 
      // geschrieben werden die unter dem gefundenen Toplevel-Item stehen. ABER DEM IST LEIDER NICHT SO!! Es werden schon wieder alle Toplevel-Items durchsucht :(

      if(itemListChildren.isEmpty())
      {
        QTreeWidgetItem *itemChild = new QTreeWidgetItem(itemTopLevel);

        itemChild->setText(0, mode);
      }
    }
}
Wer kann mir helfen, dass man auch unter einen ausgewählten Toplevel-Item, d.h. dessen children durchsuchen kann?

Schönen Gruß

Thomas :(
Dateianhänge
Definition Toplevel- und Child-Item.
Definition Toplevel- und Child-Item.
Toplevel_Child.png (8.22 KiB) 1682 mal betrachtet
Einfügen eines Child-Item unter einem Toplevel-Item.
Einfügen eines Child-Item unter einem Toplevel-Item.
Einfuegen_unter_Toplevel.png (8.51 KiB) 1682 mal betrachtet
john_Ohlsen
Beiträge: 13
Registriert: 19. Januar 2006 16:57
Wohnort: München

Lösung gefunden

Beitrag von john_Ohlsen »

Hallo,
ich habe eine Lösung gefunden. Im else-Zweig muss foldendes stehen:


Code: Alles auswählen

    

else //Es wurde ein Toplevel-Item gefunden. Es wird der Versuch unternommen, alle children nach sChildText zu durchsuchen.
    {
      QTreeWidgetItem* itemTopLevel = itemList.at(0); //Es wird dem itemTopLevel das gefundene Toplevel-Item übergeben.
      bool bFoundChild = false;
      int nChildCount = itemTopLevel->childCount();
      for (int i=0; i < nChildCount; i++)
      {
         if (itemTopLevel->child(i)->text(0) == sChildText)
        {
            bFoundChild = true;
            break;
        }
      }

      if (false == bFoundChild)
      {
        QTreeWidgetItem *itemChild = new QTreeWidgetItem(itemTopLevel);

        itemChild->setText(0, sChildText );
      }
    }
}
Antworten