前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QLayout: Attempting to add QLayout XXX to XXX, which already has a layout

QLayout: Attempting to add QLayout XXX to XXX, which already has a layout

作者头像
24K纯开源
发布2018-05-28 17:22:32
2.3K0
发布2018-05-28 17:22:32
举报
文章被收录于专栏:24K纯开源

QLayout是Qt应用开发中一个非常重要的组件,然而平时使用的时候不小心经常会发现控制台有类似如下的警告:

代码语言:javascript
复制
QLayout: Attempting to add QLayout "" to studio::FootageListDock "footagelistDock", which already has a layout

网上关于这方面的解释一直比较混乱,而且是抄来抄去的,主要是集中在QMainWindow的问题。但是实际上,如果不注意的话,任意的QWidget上使用QLayout都会出现这个警告。其实原因一般有两个:

(1)已经显式设置了QLayout后,再次给QWidget设置QLayout。这种情况下就是两次调用了QWidgetsetLayout方法。解决办法是优化代码或者删掉其中一个QLayout

(2)隐式的设置了QLayout后,再次给QWidget设置QLayout。这种情况是怎么产生的呢?看下面代码:

代码语言:javascript
复制
FootageListDock::FootageListDock(QWidget* parent)
	: QDockWidget(parent) { 
	setObjectName("footagelistDock");
	setWindowTitle(tr("Footage List")); 
	setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
	
	QHBoxLayout* mainLayout = new QHBoxLayout(this);  ## 1
	mFootageList = new FootageListWidget(this);       ## 2
	mFootageList->setRowCount(3);
	mFootageList->setColumnCount(1);
	mFootageList->setItem(0,0,new QTableWidgetItem("Jan"));
	mFootageList->setItem(1,0,new QTableWidgetItem("Feb"));
	mFootageList->setItem(2,0,new QTableWidgetItem("Mar"));
	mFootageList->setRowCount(mFootageList->rowCount() + 1);
	mFootageList->setItem(3,0, new QTableWidgetItem("April"));

	mainLayout->addWidget(mFootageList);
	QWidget* centralWidget = new QWidget(this);
	centralWidget->setLayout(mainLayout);  ## 3
	setWidget(centralWidget);
} 

其中,1和2两处代码通过this指针设置了QLayout的所属组件,也就是隐式的设置了这个QWidget的布局。而后面3处代码又再次显式调用了setLayout()方法,相当于重复设置了。于是出现了上面的警告。解决办法是,删掉1/2处的this指针或者setLayout调用即可。不管是什么类型的QWidget,都要注意这一点。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档