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

时间:2017-05-05 22:42:15

标签: c++ qt5

使用->setEnable(false)很容易在Qt中禁用窗口小部件,但如果我有很多窗口小部件,那么这个过程很繁琐且容易出错。我已经搜索了这个问题并找到了findChildren()。我想用它来禁用Windows中的所有小部件。以下修改后的代码无效

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

如何修改上述代码以禁用MainWindow类中的所有小部件?

1 个答案:

答案 0 :(得分:1)

最短版本:

mainWindow->setEnabled(false);

禁用整个窗口。

更短的代码版本:

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

findChildren需要您要查找的类型而不是QMainWindow类型。由于GUI元素继承了QWidget,因此您可以搜索它们。

this替换为指向QMainWindow的指针,除非您在所述类中实现此功能。

也可以变成一个功能:

bool disable(QObject *object)
{
    auto success { false };

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

        success = true;
    }

    return success;
}

然后拨打disable(this);中的QMainWindow

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);,或者只是将指针传递给你想要开始禁用的元素。