2017-08-18 5 views
0

Je souhaite supprimer tous les nœuds racine de la scène racine d'une Qt3DWindow. Il contient plusieurs niveaux hiérarchiques de nœuds. Je veux supprimer les références et supprimer les objets. Quelle est la manière la plus simple de faire cela?Comment puis-je supprimer tous les nœuds récursivement dans l'entité racine de Qt3DWindow?

+1

Pourquoi pas supprimer comme tout autre contenant en C++? Itérez à travers chaque objet que vous voulez supprimer, modifiez les propriétés dont vous avez besoin ("suppression des références") et stockez les références à ces objets dans une sorte de liste. À l'étape suivante, parcourez chaque élément de la liste et supprimez-le. En fin de compte effacer la liste. Ou rendre la fonction récursive (comme dans [ce post] (https://stackoverflow.com/a/17178168/5163799)) pour omettre l'utilisation de la liste. –

+0

Cela fonctionne. C'est quelques lignes de code (pas seulement une), mais cela fonctionne. Merci! – Codev

+0

@Codev Envisagez d'afficher votre solution en tant que réponse. – m7913d

Répondre

0

J'ai utilisé cette fonction récursive pour le faire:

void deleteChildrenRecursively(Qt3DCore::QNodeVector& vector) 
{ 
    foreach(Qt3DCore::QNode* node, vector){ 
     Qt3DCore::QEntity* entity = (Qt3DCore::QEntity*)node; 
     QList<Qt3DCore::QComponent*> componentsToDelete; 
     foreach(Qt3DCore::QComponent* component, entity->components()){ 
      entity->removeComponent(component); 
      delete(component); 
      component = NULL; 
     } 
     deleteChildrenRecursively(node->childNodes()); 
     delete(node); 
     node = NULL; 
    } 
} 

Il supprime tous QEntity et ses objets QComponent récursive.

Utilisation:

Qt3DCore::QEntity* rootEntity = new Qt3DCore::QEntity(); 
view->setRootEntity(rootEntity) 
... 
deleteChildrenRecursively(rootEntity->childNodes());