如何在Qt中禁用属于布局的小部件?

7

我希望能够使某些布局中的小部件无法访问,这样用户就无法更改任何布局小部件的状态(我希望所有东西都变灰)。我创建了一个信号/槽,方法名为:

void MyWidget::slot( bool bChecked )
{
  myLayout->setEnabled(bChecked);
  std::cout << "OnAllToggled: " << bChecked <<
    ", isEnabled: " << myLayout->isEnabled() << std::endl;
}

除了布局仍然可访问之外,一切都很好。显然我不理解setEnabled方法的含义。 问题: setEnabled是什么意思,如何使布局不可访问?谢谢!

2个回答

15

我想要使某个布局中的小部件无法访问,以便用户无法更改任何布局小部件的状态(我想让所有小部件变灰)。

您可以尝试禁用布局对象。当然,启用或禁用布局会影响小部件相互对齐的方式:

void QLayout::setEnabled(bool enable)

如果enable为真,则启用此布局;否则将其禁用。

启用的布局会动态调整以适应更改;禁用的布局表现得好像不存在一样。

默认情况下,所有布局都是启用的。

相反,您可以尝试禁用某个父窗口小部件的所有子项:

禁用小部件会隐式禁用其所有子项。启用会分别启用所有子小部件,除非它们已被显式禁用。在其父窗口小部件保持禁用状态时,不可能明确启用非窗口的子窗口小部件。

为此,您可以创建一个“容器”窗口小部件,占用您所说的布局,并将嵌套布局添加到该窗口小部件中以容纳所有小部件。

QWidget* container = new QWidget;
myLayout->addWidget(container);   // put container widget in myLayout
QHBoxLayout* hboxLayout = new QHBoxLayout(container);
hBoxLayout->addWidget(widget1);
hBoxLayout->addWidget(widget2); 
hBoxLayout->addWidget(widget3);
container->setEnabled(false);     // disable all nested widgets

太好了!非常感谢。 - Fatemeh Karimi

2
我遇到了一个问题,与这个问题有关:在QTCreator的设计模式下,当我禁用布局时,会禁用布局中的小部件。每个子项都有一个属性"Enabled":false。而通过编程启用布局并没有使所有子项都启用。
禁用/启用布局中的所有小部件(或仅限于所有子小部件)的方法:
for(auto&& child:ui->parentLayout->findChildren<QWidget *>()){
child->setEnabled(false);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接