QT obtenir les enfants de la mise en page

J'essaie de cacher tous les widgets dans la mise en page. Mais on dirait que findChildren ne le fait pas le travail de mise en page.

Voici mon exemple de code:

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

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

La taille est 0, mais à l'intérieur de cette mise en page, j'ai quelques widgets. Mais le même code fonctionne bien si j'essaie d'obtenir des widgets à partir du widget parent.

Comment puis-je les obtenir à partir de la mise en page appropriée?

Merci,

22
demandé sur eyllanesc 2010-11-01 01:05:39

6 réponses

La mise en page ne s'injecte pas elle-même dans l'arborescence parent-enfant, de sorte que les widgets restent les enfants (directs) de leur widget parent.

Vous pouvez utiliser QLayout::count() et QLayout::itemAt() à la place.

27
répondu Frank Osterfeld 2016-06-02 00:48:06

Vous pouvez simplement parcourir les éléments de la mise en page, en utilisant itemAt(), puis tester 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()
  }
}
22
répondu braggPeaks 2017-02-21 14:40:51

Il est très tard, mais si quelqu'un trouve ici, comme moi, voici ma solution: J'ai essayé la réponse @braggPeaks (c'est la même chose que la réponse @Frank Osterfeld) mais ça a échoué. Puis j'ai modifié comme ça et ça marche comme un charme. (Je n'ai aucune idée de pourquoi cela fonctionne, parce que ma mise en page n'a pas d'éléments nuls mais je dois quand même vérifier si c'est le cas.)

for (int i = 0; i < this->layout->count(); ++i) {
    QWidget *w = this->layout->itemAt(i)->widget();
    if(w != NULL)
        w->setVisible(false);
}
3
répondu isamert 2018-06-18 12:07:32

Comme layout ne fait pas partie de la hiérarchie des widgets, le widget doit être interrogé par parent, mais indexOf peut être utilisé pour voir s'il 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;
            }
        }
    };
1
répondu JCS 2013-01-17 01:40:15

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

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;
}
0
répondu supaflav 2015-05-13 14:06:07

Avez-vous essayé la méthode children() 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 des 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.

-1
répondu Andrew 2010-10-31 23:19:13