QLayout: Attempting to add QLayout XXX to XXX, which already has a layout
QLayout是Qt应用开发中一个非常重要的组件,然而平时使用的时候不小心经常会发现控制台有类似如下的警告:
1 | QLayout: Attempting to add QLayout "" to studio::FootageListDock "footagelistDock" , which already has a layout |
网上关于这方面的解释一直比较混乱,而且是抄来抄去的,主要是集中在QMainWindow的问题。但是实际上,如果不注意的话,任意的QWidget上使用QLayout都会出现这个警告。其实原因一般有两个:
(1)已经显式设置了QLayout后,再次给QWidget设置QLayout。这种情况下就是两次调用了QWidget的setLayout方法。解决办法是优化代码或者删掉其中一个QLayout。
(2)隐式的设置了QLayout后,再次给QWidget设置QLayout。这种情况是怎么产生的呢?看下面代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | FootageListDock::FootageListDock(QWidget* parent) : QDockWidget(parent) { setObjectName( "footagelistDock" ); setWindowTitle(tr( "Footage List" )); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); QHBoxLayout* mainLayout = new QHBoxLayout( this ); <strong>## 1</strong> mFootageList = new FootageListWidget( this ); <strong>## 2</strong> 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); <strong>## 3</strong> setWidget(centralWidget); } |
其中,1和2两处代码通过this指针设置了QLayout的所属组件,也就是隐式的设置了这个QWidget的布局。而后面3处代码又再次显式调用了setLayout()方法,相当于重复设置了。于是出现了上面的警告。解决办法是,删掉1/2处的this指针或者setLayout调用即可。不管是什么类型的QWidget,都要注意这一点。
作者:24K纯开源
Email: zhangzhongke007@163.com
出处:http://www.cnblogs.com/csuftzzk/
本文版权归24K纯开源和博客园共同拥有,欢迎转载,但未经作者同意必须保留此声明,且在文章明显位置给出原文链接,否则保留追究法律责任的权利。
【推荐】FFA 2024大会视频回放:Apache Flink 的过去、现在及未来
【推荐】中国电信天翼云云端翼购节,2核2G云服务器一口价38元/年
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步