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

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

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。这种情况是怎么产生的呢?看下面代码:

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,都要注意这一点。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏三流程序员的挣扎

RxAndroid 和 RxKotlin

RxAndroid 是在 RxJava 上的扩展,用法和 RxJava 一样。结构比较简单,主要用在 Android 上的线程切换。

82920
来自专栏Java与Android技术栈

RxJava 线程模型分析

RxJava的被观察者在使用操作符时可以利用线程调度器--Scheduler来切换线程,例如

37920
来自专栏听雨堂

C#实现微信AES-128-CBC加密数据的解密

小程序登录时,获得用户的信息,只是昵称,无法用作ID。而有用的数据,都加密着,腾讯给出了解密的方法: 加密数据解密算法 接口如果涉及敏感数据(如wx.getUs...

58390
来自专栏草根专栏

Rx.NET 简介

官网: http://reactivex.io/ 它支持基本所有的主流语言. 这里我简单介绍一下Rx.NET. 基本概念和RxJS是一样的. 下面开始切入正题....

38690
来自专栏jeremy的技术点滴

《Network Programming with Go》阅读重点备忘(一)

41470
来自专栏androidBlog

Rxjava 2.x 源码系列 - 线程切换 (下)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

18210
来自专栏Fundebug

JWT究竟是什么呢?

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

13170
来自专栏xingoo, 一个梦想做发明家的程序员

【手把手教你全文检索】Apache Lucene初探

PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语。那小博猪就简单介绍一下这一周的学习历程,仅供各位程...

278100
来自专栏Hongten

java开发_java小程序_邮死你(yousini)_源码下载

==========================================================

30420
来自专栏余林丰

利用Java提供的Observer接口和Observable类实现观察者模式

对于观察者模式,其实Java已经为我们提供了已有的接口和类。对于订阅者(Subscribe,观察者)Java为我们提供了一个接口,JDK源码如下: 1 pack...

25680

扫码关注云+社区

领取腾讯云代金券