2012-05-09 59 views
13

我想通過代碼手動設置窗口小部件的佈局(不是在Designer中),但我正在做一些事情錯誤的,因爲我得到這個警告:QWidget :: setLayout:試圖在Widget上設置QLayout「」,它已經有一個佈局

QWidget::setLayout: Attempting to set QLayout "" on Widget "", which already has a layout

而且佈局是搞砸了(標籤是在頂部,而不是底部)。

這是一個示例代碼,重新產生此問題:

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    QLabel *label = new QLabel("Test", this); 
    QHBoxLayout *hlayout = new QHBoxLayout(this); 
    QVBoxLayout *vlayout = new QVBoxLayout(this); 
    QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Fixed); 
    QLineEdit *lineEdit = new QLineEdit(this); 
    hlayout->addItem(spacer); 
    hlayout->addWidget(lineEdit); 
    vlayout->addLayout(hlayout); 
    vlayout->addWidget(label); 
    setLayout(vlayout); 
} 
+0

WOW,一切就只是一個簡單的錯誤這項工作: QHBoxLayout,負責* buttonLayout =新QHBoxLayout,負責(); 而不是: QHBoxLayout * buttonLayout = new QHBoxLayout(this); – user1369511

+0

與我在PySide中一樣,將hl = QtGui.QHBoxLayout(self)更改爲hl = QtGui.QHBoxLayout() – gseattle

回答

6

的問題是,您使用的this父創建的佈局。當你這樣做時,它將佈局設置爲this的主佈局。因此,撥打setMainLayout()是多餘的。

15

因此,我相信你的問題是在這條線:

QHBoxLayout *hlayout = new QHBoxLayout(this); 

特別是,我認爲這個問題是通過thisQHBoxLayout。因爲您打算將此QHBoxLayout設置爲this的頂層佈局,所以您不應將this傳遞給構造函數。

這裏是我重新寫,我闖入了一個測試應用程序在本地,似乎工作的偉大:

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    QLabel *label = new QLabel("Test"); 
    QHBoxLayout *hlayout = new QHBoxLayout(); 
    QVBoxLayout *vlayout = new QVBoxLayout(); 
    QSpacerItem *spacer = new QSpacerItem(40, 20, QSizePolicy::Fixed); 
    QLineEdit *lineEdit = new QLineEdit(); 
    hlayout->addItem(spacer); 
    hlayout->addWidget(lineEdit); 
    vlayout->addLayout(hlayout); 
    vlayout->addWidget(label); 
    setLayout(vlayout); 
} 
相關問題