Qt从其他布局中删除布局

时间:2017-02-02 22:39:40

标签: c++ qt qlayout

When I use delete layout_newInfo; layout_main->update() happends this.如何在运行时从layout_main中删除layout_newInfo(按下按钮)?

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();

3 个答案:

答案 0 :(得分:2)

您想要达到什么目标? 如果要显示/隐藏现在在layout_newInfo中的小部件,那么 不要使用布局。使用放在layout_main(垂直布局)中的小部件,它本身具有newInfo项和布局,然后根据需要在小部件上使用setVisible(true / false)。

答案 1 :(得分:0)

  

如果layout_newInfo嵌套到layout_main,我如何在运行时从layout_main中删除layout_newInfo?

语义更清晰的方法:

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

因此,只有在没有触发其他更新的情况下,有时仅需要layout_main->update()调用的代码示例的2个底线就足够了。

来自here的示例显示,删除QLayoutItem的父QLayout确实会将其从上层布局结构中移除(其析构函数会将其删除)。

答案 2 :(得分: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(""),所以下次显示片段时,它会很清楚;