QLayout是Qt應用開發中一個很是重要的組件,然而平時使用的時候不當心常常會發現控制檯有相似以下的警告:bash
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。這種狀況是怎麼產生的呢?看下面代碼:this
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,都要注意這一點。指針