web-dev-qa-db-fra.com

Qt obtenir des enfants de la mise en page

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.

Voici mon exemple de code:

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

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

size est 0, mais à l'intérieur de cette disposition, 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 d'une mise en page appropriée?

32
Alex Ivasyuv

La disposition ne "s'injecte" pas dans l'arbre parent-enfant, les widgets restent donc les enfants (directs) de leur widget parent.

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

34
Frank Osterfeld

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()
  }
}
29
braggPeaks

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 que la réponse @Frank Osterfeld) mais ça a échoué. Ensuite, j'ai modifié comme ça et ça fonctionne comme un charme. (Je ne sais pas pourquoi cela fonctionne, car ma mise en page ne contient aucun élément nul, 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);
}
6
isamert

Étant donné que la mise en page ne fait pas partie de la hiérarchie des widgets, le widget doit être interrogé auprès du 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
JCS

Répondant à un ancien message, 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é à 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;
}
0
supaflav