web-dev-qa-db-ja.com

Qtはレイアウトから子を取得します

レイアウト内のすべてのウィジェットを非表示にしようとしています。しかし、findChildrenはレイアウトでは機能しないようです。

これが私のサンプルコードです:

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

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

sizeは0ですが、このレイアウト内にはいくつかのウィジェットがあります。しかし、親ウィジェットからウィジェットを取得しようとすると、同じコードが正常に機能します。

適切なレイアウトからそれらをどのように取得できますか?

32
Alex Ivasyuv

レイアウトは親子ツリーにそれ自体を「挿入」しないため、ウィジェットは親ウィジェットの(直接)子のままです。

代わりにQLayout::count()およびQLayout::itemAt()を使用できます。

34
Frank Osterfeld

itemAt()を使用してレイアウトのアイテムを単純に反復処理し、アイテムがウィジェットかどうかをテストできます。

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

それは非常に遅いですが、誰かが私のようにここで見つけた場合、ここに私の解決策があります。それから私はこのように変更し、それは魅力のように動作します。 (レイアウトにnullアイテムがないため、なぜ機能するのかわかりませんが、機能するかどうかを確認する必要があります。)

for (int i = 0; i < this->layout->count(); ++i) {
    QWidget *w = this->layout->itemAt(i)->widget();
    if(w != NULL)
        w->setVisible(false);
}
6
isamert

レイアウトはウィジェット階層の一部ではないため、ウィジェットは親から照会する必要がありますが、indexOfを使用して、ウィジェットが属しているかどうかとその場所を確認できます

  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

以前の投稿に返信しましたが、レイアウトや子レイアウトに含まれるすべてのウィジェットを無効にする簡単な方法が必要でした。これは私の目的のために働きました:

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