2017-05-05 13 views
0

->setEnable(false)を使用してQtのウィジェットを無効にするのは簡単ですが、ウィジェットがたくさんある場合は、処理が面倒でエラーが発生しやすくなります。私はこの問題を探して、findChildren()を見つけました。ウィンドウ内のすべてのウィジェットを無効にするために使用したいと思います。以下の変更されたコードは、どのように私は私のメインウィンドウクラス内のすべてのウィジェットを無効にするには上記のコードを変更することができMainWindowのすべてのウィジェットを再帰的に無効にする方法

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

が動作していませんか?

答えて

1

最短バージョン:

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; 
} 

次に、あなたのQMainWindowdisable(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);または単にあなたのようなウィンドウでそれを呼び出すことができます。

+0

ありがとうございました。最短バージョンでは、もう一度ボタンを有効にすることはできません。助言がありますか! – CroCo

+0

@CroCoこれは、親がまだ無効になっているからです。特定の要素をすべてではなく無効にしたい場合は、 'QWidget *'の部分を 'this-> findChildren ()'と置き換える必要があります。これにより 'QPushButton'だけがすべて無効になります。 – deW1

+0

これはもう一度感謝しましたが、私のGUIですべてのウィジェット(QPushButton、QTextEdit、...など)を検討する必要があるため、このソリューションはちょっと面倒です。 1回の呼び出しでこれを処理する高度なアプローチはありますか? – CroCo

関連する問題