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,
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.
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()
}
}
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);
}
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;
}
}
};
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;
}
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.