应对旧的文章,但我想要一个简单的方法来禁用所有小工具包含在布局或任何子布局中。这适用于我的目的:
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;
}
关键是,布局可以成为一个小部件的孩子(因为他们都继承'QObject'),但小部件不能成为布局的子元素。一个窗口小部件必须有另一个窗口小部件作为父窗口,'QLayout'不会继承'QWidget'。 Layouts将包含在['QLayoutItem'](http://doc.qt.io/qt-4.8/qlayoutitem.html#QLayoutItem)中的每个项目中,因此需要一组不同的API来访问基础对象。 – ekhumoro 2015-05-13 16:26:42