使用 ->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);
一样在窗口中调用它,也可以通过将指针传递给要开始禁用的元素。