清空QWidget

发布于:2024-08-08 ⋅ 阅读:(50) ⋅ 点赞:(0)

一、背景

        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。


网站公告

今日签到

点亮在社区的每一天
去签到