一、背景
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();// 当前项是QWidgetif (widget1) {func_clear(widget1->layout());layout0->removeWidget(widget1);delete widget1;}// 当前项是QLayoutif (layout1) {func_clear(layout1);layout0->removeItem(layout1);delete layout1;}// 当前项是QSpacerItemif (item1) {layout0->removeItem(item1);delete item1;}}};func_clear(layout);delete layout;
}
三、注意事项
可以传入QDialog,但是不能直接传QMainWindow,只能传QMainWindow的centralWidget。