在按钮上设置新布局

时间:2012-07-18 09:40:30

标签: qt layout clear

我在按钮上设置了一个布局(包含QLabel和QSpacers),我想用一个新的替换它。为此,我制作了以下代码:

while(!layout.isEmpty())
{
    delete(layout.takeAt(0));
}

在此之后我设置了新的布局:

layout.addWidget(...)
layout.addSpacer(...)
...
button.setLayout(layout)

不幸的是,新的布局已经设置好了,但旧的布局仍然可以看到。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

根据您的评论,您要删除窗口小部件中的项目,而不是布局。 QLayout::takeAt会返回QLayoutItem*。因此,您循环遍历窗口小部件的布局并删除布局项,而不是添加到布局项的窗口小部件。作为测试,您可以尝试以下方法:

while(!layout.isEmpty())
{
    delete layout.itemAt(0)->widget();
    delete layout.takeAt(0);
}

但是,这不是我认为的长期良好设计。可能有一些特殊情况,这是最好的方法,但我建议使用堆叠小部件或类似的东西在呈现的小部件之间来回切换,而不是在按钮中销毁和重新创建整个小部件阵列。或者,考虑两个不同的按钮,然后销毁并重新插入按钮而不是按钮的内容。

答案 1 :(得分:0)

您可以尝试

delete button.layout();

在设置新布局之前。

或者,您可以将小部件等添加到现有布局(然后不设置新布局)。

[编辑] 只要您只在旧布局上使用指针,这应该有效:

QLayout* layout = button.layout();
while( !layout->isEmpty() )
{
    delete( layout->takeAt( 0 ) );
}

layout->addWidget(...)   
layout->addSpacer(...)
// do not call button.setLayout()

[EDIT2] 如果这只是一个更新问题,您可以尝试

button->update();
QApplication::processEvents( QEventLoop::IgnoreUserInputEvents );