一、背景
Qt开发三年多了,近来用新的架构实现了原软件。为了方便其他模块的调用,尽可能的用一句代码即可调用。比如显示版权信息,只要其他模块将QWidget传过来,我将版权信息显示在该控件上就了。但如果调用两次的话,第二次调用时界面上已经有控件,新的控件显示就会重叠或者其他错误,这就要求先将传过来的QWidget清空,再添加上版权相关的控件和信息。
二、实现
查了多种方案,都有些问题,花了些时间完善了一下别人的代码,测试了一下没测出问题,现将代码分享一下。
// 清空控件
void ClearWidget(QWidget* widget)
{
ClearLayout(widget->layout());
}
void ClearLayout(QLayout* layout)
{
if (NULL == layout) return;
//
std::function<void(QLayout*)> func_clear = [&](QLayout* layout0) {
if (NULL == layout0) return;
int count = layout0->count();
for (int i = 0; i < count; i++) {
QLayoutItem* item = layout0->itemAt(0);
QWidget* widget1 = item->widget();
QLayout* layout1 = item->layout();
QSpacerItem* item1 = item->spacerItem();
// 当前项是QWidget
if (widget1) {
func_clear(widget1->layout());
layout0->removeWidget(widget1);
delete widget1;
}
// 当前项是QLayout
if (layout1) {
func_clear(layout1);
layout0->removeItem(layout1);
delete layout1;
}
// 当前项是QSpacerItem
if (item1) {
layout0->removeItem(item1);
delete item1;
}
}
};
func_clear(layout);
delete layout;
}
三、注意事项
可以传入QDialog,但是不能直接传QMainWindow,只能传QMainWindow的centralWidget。