1

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

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

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

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

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

4

2 回答 2

2

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

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

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

于 2012-07-18T18:27:00.450 回答
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 );
于 2012-07-18T09:50:34.500 回答