2017-02-02 7 views
0

When I use delete layout_newInfo; layout_main->update() happends this. Как удалить layout_newInfo из layout_main во время выполнения (нажатие кнопки)?Qt remove Layout from other Layout

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

Обратите внимание, что вызов 'layout-> removeItem (item);' в цикле 'while' ничего не делает, поскольку переданный' item' уже был удален вызовом ['QLayout :: takeAt'] (http: // doc.qt.io/qt-5/qlayout.html#takeAt). –

ответ

0

Как я могу удалить layout_newInfo из layout_main во время выполнения с учетом layout_newInfo вложен в layout_main?

семантически понятнее метод:

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

BTW, как правило, это также должно сделать то же самое удаление вложенного макета:

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); 'находится в Constructor. И когда кнопка нажата, появляется эта часть 'layout_main-> addLayout (layout_newInfo);' –

+0

, если 'layout_newInfo' непосредственно вложен в' layout_main', просто выполните 'delete layout_newInfo' и, возможно,' layout_main -> update() 'as Что ж. – 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 («»), так что в следующий раз показывает фрагмент, его будет ясно;