最短バージョン:
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);
または単にあなたのようなウィンドウでそれを呼び出すことができます。
ありがとうございました。最短バージョンでは、もう一度ボタンを有効にすることはできません。助言がありますか! – CroCo
@CroCoこれは、親がまだ無効になっているからです。特定の要素をすべてではなく無効にしたい場合は、 'QWidget *'の部分を 'this-> findChildren()'と置き換える必要があります。これにより 'QPushButton'だけがすべて無効になります。 –
deW1
これはもう一度感謝しましたが、私のGUIですべてのウィジェット(QPushButton、QTextEdit、...など)を検討する必要があるため、このソリューションはちょっと面倒です。 1回の呼び出しでこれを処理する高度なアプローチはありますか? – CroCo