如何将MainWindow中的所有小部件递归禁用

  • 本文关键字:小部 递归 MainWindow c++ qt5
  • 更新时间 :
  • 英文 :


使用 ->setEnable(false)在qt中禁用窗口小部件很容易,但是如果我有很多小部件,那么该过程很乏味且容易出错。我已经搜索了此问题并找到了findChildren()。我想使用它禁用窗口中的所有小部件。以下修改的代码不起作用

for (auto widget : findChildren<QMainWindow*>())
      if (! qobject_cast<QWidget*>(widget)) widget->setEnabled(false);

如何修改前面的代码以禁用我的MainWindow类中的所有小部件?

最短版本:

mainWindow->setEnabled(false);

禁用整个窗口。


较短的代码版本:

for(auto *widget : this->findChildren<QWidget *>())
{
    widget->setEnabled(false);
}

findChildren需要您想要找到的类型而不是类型QMainWindow。由于GUI元素继承QWidget您搜索它们。

除非您在上述类中实现此功能,否则用指向QMainWindow的指针替换this


也可以变成一个函数:

bool disable(QObject *object)
{
    auto success { false };
    if(object)
    {
        for(auto *widget : object->findChildren<QWidget *>())
        {
            widget->setEnabled(false);
        }
        success = true;
    }
    return success;
}

然后在您的QMainWindow中致电disable(this);


findChildren<QWidget *>(QRegularExpression { "p.*" }) // to disable all items starting with "p"

findChildren还采用正则表达式,因此,如果您只想禁用某些项目,则可以在其名称中指定独特的内容并这样选择。


更长的版本:

void disableAll(QObject *item)
{
    if(item)
    {
        auto children { item->children() };
        for(auto *child : children)
        {
            auto *widget { qobject_cast<QWidget *>(child) };
            if(widget)
            {
                // recursive approach might / shouldn't be needed
                // as all children of each item automatically get disabled
                // if their parent is disabled.
                disableAll(child);
                widget->setEnabled(false);
            }
        }
    }
}

您可以像此disableAll(this);一样在窗口中调用它,也可以通过将指针传递给要开始禁用的元素。

最新更新