zoukankan      html  css  js  c++  java
  • QWidget::setLayout: Attempting to set QLayout "" on xxx "", which already has a layout

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

    QWidget::setLayout: Attempting to set QLayout "" on xxx "", 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,都要注意这一点。

    转自:

    https://www.cnblogs.com/csuftzzk/p/qlayout_warnings.html

  • 相关阅读:
    ssm整合用到的依赖jar包(不充足)
    eclipse中Maven web项目的目录结构浅析
    何时使用抽象类?何时使用接口?
    $().attr() 和 $().css的区别
    AJAX防重复提交的办法总结
    CentOS 8 扩展LVM,更改xfs卷报错解决方法
    安装Minikube无法访问k8s.gcr.io的简单解决办法
    Windows 10、Ubuntu 18.04 双系统 双硬盘 安装经验总结
    转眼十年
    Dresdon二次开发
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/11413305.html
Copyright © 2011-2022 走看看