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()andQLayout::itemAt()代替。

于 2010-11-01T07:09:35.967 回答
40

您可以简单地使用 迭代布局的项目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()
  }
}
于 2013-05-23T06:38:18.883 回答
11

已经很晚了,但是如果有人像我一样在这里找到,这是我的解决方案:我尝试了@braggPeaks 答案(与@Frank Osterfeld 答案相同)但失败了。然后我像这样修改它,它就像一个魅力。(我不知道它为什么起作用,因为我的布局没有空项目,但我仍然必须检查它是否有。)

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

您是否尝试children()过 method 而不是findChildren()?也许你从方法中得到了一个“坏”的布局widget -> findChild<QLayout *> (layoutName)。尝试在创建布局后立即找到孩子 - 这样您就可以确定布局是正确的。这样做您将能够确定哪个功能出错。

于 2010-10-31T23:19:13.427 回答