c++ - qobjectuserdata - Qt Kinder aus dem Layout bekommen




qt findchildren example (4)

Da das Layout nicht Teil der Widgethierarchie ist, muss das Widget vom übergeordneten Objekt abgefragt werden, aber dann kann indexOf verwendet werden, um zu sehen, ob es gehört und wo es sich befindet

  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;
            }
        }
    };

Ich versuche alle Widgets im Layout zu verstecken. Sieht aber so aus, als ob findChildren nicht für das Layout funktioniert.

Hier ist mein Beispielcode:

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

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

Größe ist 0, aber innerhalb dieses Layouts habe ich ein paar Widgets. Aber derselbe Code funktioniert gut, wenn ich versuche, Widgets vom übergeordneten Widget zu bekommen.

Wie kann ich sie von einem geeigneten Layout bekommen?

Vielen Dank,


Das Layout "injiziert" sich nicht in den Eltern-Kind-Baum, so dass die Widgets (direkte) Kinder des übergeordneten Widgets bleiben.

Sie könnten QLayout::count() und QLayout::itemAt() verwenden.


Hast du die children() -Methode anstelle von findChildren() ? Vielleicht erhalten Sie ein "schlechtes" Layout von der Methode widget -> findChild<QLayout *> (layoutName) . Versuchen Sie, Kinder direkt nach dem Erstellen des Layouts zu finden - damit Sie sicher sind, dass das Layout korrekt ist. Auf diese Weise können Sie feststellen, welche Funktion falsch funktioniert.


Reagieren auf einen alten Post, aber ich wollte einen einfachen Weg, um alle Widgets in einem Layout oder einem Kind-Layout zu deaktivieren. Dies funktionierte für meine Zwecke:

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;
}




qt-designer