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

20,928

Solution 1

So I believe your problem is in this line:

QHBoxLayout *hlayout = new QHBoxLayout(this);

In particular, I think the problem is passing this into the QHBoxLayout. Because you intend for this QHBoxLayout to NOT be the top level layout of this, you should not pass this into the constructor.

Here's my re-write that I hacked into a test app locally and seems to work great:

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);
}

Solution 2

The problem is that you are creating layouts with a parent of this. When you do that, it sets the layout to be the main layout of this. Thus, it is redundant to call setMainLayout().

Share:
20,928
user1369511
Author by

user1369511

Updated on April 15, 2020

Comments

  • user1369511
    user1369511 about 4 years

    I'm trying to set the layout of a widget manually through code (not in Designer), but I'm doing something wrong, because I get this warning:

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

    And also the layout is messed up (the label is at the top, instead of the bottom).

    This is an example code that reproduces the problem:

    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);
    }