使用->setEnable(false)
很容易在Qt中禁用窗口小部件,但如果我有很多窗口小部件,那么这个过程很繁琐且容易出错。我已经搜索了这个问题并找到了findChildren()
。我想用它来禁用Windows中的所有小部件。以下修改后的代码无效
for (auto widget : findChildren<QMainWindow*>())
if (! qobject_cast<QWidget*>(widget)) widget->setEnabled(false);
如何修改上述代码以禁用MainWindow类中的所有小部件?
答案 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);
,或者只是将指针传递给你想要开始禁用的元素。