38

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

ここに私のサンプルコードがあります:

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

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

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

適切なレイアウトからそれらを取得するにはどうすればよいですか?

4

6 に答える 6

43

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

QLayout::count()代わりにandを使用できますQLayout::itemAt()

于 2010-11-01T07:09:35.967 に答える
11

非常に遅いですが、誰かが私のようにここで見つけた場合、ここに私の解決策があります: @braggPeaks の回答を試しました (@Frank Osterfeld の回答と同じです) が失敗しました。それから私はこのように修正しました、そしてそれは魅力のように機能します。(私のレイアウトにはnull項目がないため、なぜ機能するのかわかりませんが、それでもあるかどうかを確認する必要があります。)

for (int i = 0; i < this->layout->count(); ++i) {
    QWidget *w = this->layout->itemAt(i)->widget();
    if(w != NULL)
        w->setVisible(false);
}
于 2014-08-27T21:05:53.397 に答える
1

レイアウトはウィジェット階層の一部ではないため、ウィジェットは親から照会する必要がありますが、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;
            }
        }
    };
于 2013-01-17T01:40:15.880 に答える
0

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

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;
}
于 2015-05-13T14:06:07.497 に答える
-1

Did you try children() method instead of findChildren() ? Maybe you are getting a 'bad' layout from widget -> findChild<QLayout *> (layoutName) method. Try to find children right after creating the layout - so you are sure the layout is correct. Doing so you will be able do determine what function works wrong.

于 2010-10-31T23:19:13.427 に答える