QLayout是Qt應用開發中一個非常重要的組件,然而平時使用的時候不小心經常會發現控制台有類似如下的警告:
QWidget::setLayout: Attempting to set QLayout "" on xxx "", which already has a layout
網上關於這方面的解釋一直比較混亂,而且是抄來抄去的,主要是集中在QMainWindow的問題。但是實際上,如果不注意的話,任意的QWidget上使用QLayout都會出現這個警告。其實原因一般有兩個:
(1)已經顯式設置了QLayout后,再次給QWidget設置QLayout。這種情況下就是兩次調用了QWidget的setLayout方法。解決辦法是優化代碼或者刪掉其中一個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
