應對舊的文章,但我想要一個簡單的方法來禁用所有小工具包含在佈局或任何子佈局中。這適用於我的目的:
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