c++ findchildren - Qt Kinder aus dem Layout bekommen




example qobjectuserdata (6)

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

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,


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

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.


Sie können einfach mit itemAt() über die Elemente des Layouts iterieren und dann testen, ob es sich bei dem Element um ein Widget handelt:

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

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.


std::basic_string ist eine Klassenvorlage zum std::basic_string Zeichenfolgen aus Zeichentypen, std::string ist ein typedef für eine Spezialisierung dieser Klassenvorlage für char . Ja, sie werden beide benötigt (oder zumindest vom Standard gefordert).





c++ qt qt4 qt-designer