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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM