Qt从布局中获取孩子

Ale*_*yuv 30 c++ qt qt4 qt-designer

我试图隐藏布局中的所有小部件.但看起来findChildren不适合布局.

这是我的示例代码:

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

cout << list.size() << endl;
Run Code Online (Sandbox Code Playgroud)

size是0,但在这个布局中我有一些小部件.但是,如果我尝试从父窗口小部件获取窗口小部件,相同的代码工作正常.

我如何从适当的布局中获取它们?

Fra*_*eld 35

布局不会在父子树中"注入"自身,因此窗口小部件保留(直接)其父窗口小部件的子项.

你可以使用QLayout::count()QLayout::itemAt()不是.

  • 关键点在于布局可以成为窗口小部件的子窗口(因为它们都继承了`QObject`),但窗口小部件不能成为布局的子窗口.一个小部件必须有另一个小部件作为父级,而`QLayout`不会继承`QWidget`.布局将它们包含的每个项目包装在[`QLayoutItem`](http://doc.qt.io/qt-4.8/qlayoutitem.html#QLayoutItem)中,因此访问底层对象需要一组不同的API. (7认同)

bra*_*aks 29

您可以简单地遍历布局的项目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()
  }
}
Run Code Online (Sandbox Code Playgroud)


isa*_*ert 6

已经很晚了,但是如果有人找到像我这样的人,这就是我的解决方案:我尝试了@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);
}
Run Code Online (Sandbox Code Playgroud)