2017-02-02 155 views
0

When I use delete layout_newInfo; layout_main->update() happends this.如何從運行時的layout_main中刪除layout_newInfo(按下按鈕)?Qt從其他佈局刪除佈局

I need get this back after pressing button (next image)

Delete orange section (layout_newInfo) by pressing button Add Component

代碼我想:

QLayout *layout = this->layout(); 

    QLayoutItem *item; 
    while ((item = layout->takeAt(0)) != 0) 
     layout->removeItem (item); 
    delete layout_newInfo; 
    layout_main->update(); 
+0

顯示您嘗試過的代碼。 – eyllanesc

+0

向Qestien添加了代碼。 –

+0

請注意,在while循環中調用'layout-> removeItem(item);'什麼也不做,因爲'item'傳遞已經被調用['QLayout :: takeAt'](http:// doc.qt.io/qt-5/qlayout.html#takeAt)。 –

回答

0

我怎樣才能在運行時從layout_main刪除layout_newInfo給出layout_newInfo嵌套到layout_main?

語義上更清晰的方法:

layout_main->removeItem(layout_newInfo); // make sure layout_newInfo object deleted 
             // after either by parent or somehow else 

順便說一句,通常這也應該做同樣的去除嵌套佈局:

delete layout_newInfo; // also removes it from upper layout 
layout_main->update(); // triggers update on the screen 

所以,僅僅2的代碼示例的底線應該如果沒有其他更新觸發,只需要撥打layout_main->update()即可。

here的示例顯示刪除QLayoutItem(作爲QLayout的父項)也將其從上層佈局結構(它的析構函數)中刪除。

+0

這部分'layout_main = new QVBoxLayout; layout_main-> addLayout(layout_header); layout_main-> addLayout(layout_data); layout_main-> addLayout(layout_buttons); setLayout(layout_main);'在構造函數中。 當按鈕被點擊出現這部分 'layout_main-> addLayout(layout_newInfo);' –

+0

如果'layout_newInfo'直接嵌套到'layout_main'只是'刪除layout_newInfo'和'layout_main - > update()'作爲好。 – AlexanderVX

+0

,但隨後出現一些神器。佈局不會讓它停留在其他佈局上。 –

2

你想達到什麼目的? 如果要顯示/隱藏現在位於layout_newInfo中的小部件,則 不使用佈局。使用放置在layout_main(垂直佈局)中的小部件,該小部件本身具有newInfo項目和佈局,然後根據需要在小部件上使用setVisible(true/false)。

0

最後找到答案最好的辦法是讓像void showNewInfo(QString action);

無效的方法在類的cpp文件

void MainWind::showNewInfo(QString action) 
{ 
    if(action == "true") 
    { 
     bt_search->setEnabled(false); 
     bt_production->setEnabled(false); 
     bt_drying->setEnabled(false); 
     bt_storage->setEnabled(false); 
     ln_spent->show(); 
     cb_thickness1->show(); 
     cb_thickness2->show(); 
     cb_thickness3->show(); 
     cb_EFL1->show(); 
     cb_EFL2->show(); 
     bt_newItem->show(); 
    } 
    else if(action == "false") 
    { 
     bt_search->setEnabled(true); 
     bt_production->setEnabled(true); 
     bt_drying->setEnabled(true); 
     bt_storage->setEnabled(true); 
     ln_spent->hide(); 
     cb_thickness1->hide(); 
     cb_thickness2->hide(); 
     cb_thickness3->hide(); 
     cb_EFL1->hide(); 
     cb_EFL2->hide(); 
     bt_newItem->hide(); 
    } 
} 

也有可能使用的setText(「」),那麼下一次展示片段,它將會清楚;