2017-05-05 33 views
0

這是很容易使用->setEnable(false)禁止在Qt的一個小部件,但如果我有很多小部件,那麼這個過程是繁瑣且容易出錯。我搜索了這個問題,發現了findChildren()。我想用它來禁用窗口中的所有小部件。以下修改代碼不起作用如何禁用主窗口所有控件遞歸

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

如何修改上述代碼以禁用MainWindow類中的所有窗口小部件?

回答

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

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);或乾脆。

+0

謝謝你的答案。最短的版本不允許我再次啓用按鈕。有什麼建議麼! – CroCo

+0

@CroCo這是因爲父母仍然被禁用。如果你想具體的元素被禁用,而不是所有你必須與更換'QWidget的*'部分例如'這個 - > findChildren ()',然後將禁用所有'只有QPushButton'。 – deW1

+0

這再次感謝工作但這種解決方案是有點乏味,因爲我需要考慮的所有部件(即QPushButton,的QTextEdit,...等)在我的GUI。是否有一種先進的方法來處理一個電話中的問題? – CroCo