专栏首页24K纯开源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

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 条评论
登录 后参与评论

相关文章

  • QMainWindow 和 QWidget 设置layout

    给QWidget或者QDialog设置布局的时候方式很简单。创建好一个布局:mainLayout,然后不停地把各个控件往ma...

    _gongluck
  • 初步学习Qt布局

    在一个Widget中,Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget,以保证他们能够很好地利用可用空间。

    bear_fish
  • PySide——Python图形化界面入门教程(二)

    PySide——Python图形化界面入门教程(二)   ——交互Widget和布局容器                ——Interactive Widge...

    ascii0x03
  • supervisor 从安装到使用

    先下载最新的supervisor安装包:https://pypi.python.org/pypi/supervisor , 如:

    yaohong
  • [English] Creating a New Theme

    This tutorial will show you how to create a simple theme in Hugo. I assume that ...

    caoayu
  • 基于jQuery的前端开发框架,在企业级开发领域里已经凉了吗?

    On 2017-03-28 I visited a local customer who have been using our CRM on-Premise ...

    Jerry Wang
  • Graph application with Python, Neo4j, Gephi & Linkurious.js

    I love Python, and to celebrate Packt Python week, I’ve spent some time developi...

    fishexpert
  • ceph分布式存储-对象存储(RGW)搭建

    PG数量的预估 集群中单个池的PG数计算公式如下:PG 总数 = (OSD 数 * 100) / 最大副本数 / 池数 (结果必须舍入到最接近2的N次幂的值)

    Lucien168
  • React源码解析之renderRoot概览

    一、renderRoot 主要的作用: (1) 调用 workLoop 进行循环单元更新 (2) 捕获错误并进行处理 (3) 走完流程后,根据workInPro...

    进击的小进进

扫码关注云+社区

领取腾讯云代金券