2010-10-31 23 views
20

J'essaie de cacher tous les widgets dans la mise en page. Mais il semble que findChildren ne fonctionne pas pour la mise en page.Qt obtenir des enfants de la mise en page

Voici mon exemple de code:

QLayout * layout = widget -> findChild<QLayout *> (layoutName); 
QList<QWidget *> list = layout -> findChildren<QWidget *>(); 

cout << list.size() << endl; 
taille

est 0, mais à l'intérieur de cette disposition j'ai quelques widgets. Mais le même code fonctionne très bien si j'essaie d'obtenir des widgets du widget parent.

Comment puis-je les obtenir à partir d'une disposition appropriée?

Merci,

Répondre

24

La mise en page ne "s'injecte" pas dans l'arborescence parent-enfant, donc les widgets restent (directement) les enfants de leur widget parent. Vous pouvez utiliser QLayout::count() et QLayout::itemAt() à la place.

+4

Le point clé est qu'une mise en page peut devenir un enfant d'un widget (parce qu'ils hérite de 'QObject'), mais un widget ne peut pas devenir un enfant d'une mise en page. Un widget doit avoir un autre widget en tant que parent, et 'QLayout' n'hérite pas de' QWidget'. Les mises en page enveloppent chaque élément qu'elles contiennent dans un ['QLayoutItem'] (http://doc.qt.io/qt-4.8/qlayoutitem.html#QLayoutItem), et un ensemble d'API différent est donc requis pour accéder à l'objet sous-jacent. – ekhumoro

-1

Avez-vous essayé children() méthode au lieu de findChildren()? Peut-être que vous obtenez une mauvaise mise en page de la méthode widget -> findChild<QLayout *> (layoutName). Essayez de trouver les enfants juste après avoir créé la mise en page - vous êtes donc sûr que la mise en page est correcte. Ce faisant, vous serez en mesure de déterminer quelle fonction fonctionne mal.

+0

Oui J'ai essayé des enfants(), sans n'importe quelle chance. Je ne peux pas vérifier après la création, car cela est chargé à partir de .ui ... Pour les widgets fonctionne bien ... Problème seulement avec la mise en page .. –

1

Depuis la mise en page ne fait pas partie de la hiérarchie widget, le widget doit être interrogé de parent mais indexOf peut être utilisé pour voir si elle appartient et son emplacement

QLayout * top_l= layout(); // The parent widgets layout 
    // Find your layout that you want to search inside 
    QHBoxLayout * hbox = top_l->findChild<QHBoxLayout*>(QString("horizontalLayout_2")); 
    if (hbox != 0) { 
     std::cout << "Found horizontalLayout_2!"<<std::endl; 
     QPushButton * st = findChild<QPushButton*>(QString("startButton")); 

     if (st != 0) { 
      std::cout << "Found startButton in top level widget"<<std::endl; 
      int idx = hbox->indexOf(st); 
      if (idx >=0) { 
       std::cout << "Found startButton in hbox layout at location : " 
          <<idx<<std::endl; 
      } 
     } 
    }; 
19

Vous pouvez simplement itérer sur les éléments de la mise en page , en utilisant itemAt(), puis de vérifier si l'élément est un widget:

for (int i = 0; i < gridLayout->count(); ++i) 
{ 
    QWidget *widget = gridLayout->itemAt(i)->widget(); 
    if (widget != NULL) 
    { 
    widget->setVisible(false); 
    } 
    else 
    { 
    // You may want to recurse, or perform different actions on layouts. 
    // See gridLayout->itemAt(i)->layout() 
    } 
} 
1

il est très tard, mais si quelqu'un trouve ici comme moi, voici ma solution: J'ai essayé @braggPeaks réponse (il est même que la réponse @Frank Osterfeld) mais il f ailé. Puis j'ai modifié comme ça et ça fonctionne comme un charme. (Je ne sais pas pourquoi cela fonctionne, parce que ma mise en page n'a pas d'éléments nuls mais je dois vérifier si elle a.)

for (int i = 0; i < this->layout->count(); ++i) { 
    QWidget *w = this->layout->itemAt(i)->widget(); 
    if(w != NULL) 
     w->setVisible(false); 
} 
0

Répondant à un ancien poste, mais je voulais un moyen simple de désactiver tous les widgets contenu dans une mise en page ou toute mise en page enfant. Cela a fonctionné pour mes fins:

void setEnabledWidgetsInLayout(QLayout *layout, bool enabled) 
{ 
    if (layout == NULL) 
     return; 

    QWidget *pw = layout->parentWidget(); 
    if (pw == NULL) 
     return; 

    foreach(QWidget *w, pw->findChildren<QWidget*>()) 
    { 
     if (isChildWidgetOfAnyLayout(layout,w)) 
     w->setEnabled(enabled); 
    } 
} 

bool isChildWidgetOfAnyLayout(QLayout *layout, QWidget *widget) 
{ 
    if (layout == NULL or widget == NULL) 
     return false; 

    if (layout->indexOf(widget) >= 0) 
     return true; 

    foreach(QObject *o, layout->children()) 
    { 
     if (isChildWidgetOfAnyLayout((QLayout*)o,widget)) 
     return true; 
    } 

    return false; 
}