2012-07-18 96 views
1

我在按钮上设置了一个布局(包含QLabels和QSpacers),我想用新布局替换它。要做到这一点我做了下面的代码:在按钮上设置新布局

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

这之后我设置了新的布局:

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

不幸的是,新的布局设置,但老人们可以依稀可见。我该如何解决这个问题?

回答

2

根据您的意见,您要删除小工具中的项目,而不是布局。 QLayout::takeAt返回QLayoutItem*。因此,您正在循环小部件的布局并删除布局项目,但不会添加到布局项目中的小部件。作为一个测试,你可以尝试以下代替:

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

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

+0

它通过替换按钮来工作。谢谢! – Frank 2012-07-19 07:22:31

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); 
+0

谢谢,但我不想删除整个布局。我想清空它,并把新的部件/垫片放在那里。所以我想在按钮上保持相同的布局。 – Frank 2012-07-18 10:15:23

+0

看到我对此编辑 – 2012-07-18 10:48:37

+0

仍然没有成功。它确实显示了新的布局,但旧的小部件仍然可以在新布局的“下面”看到。就好像删除布局小部件是不够的......也许我不应该使用删除,而是使用不同的命令? – Frank 2012-07-18 11:40:29