Подтвердить что ты не робот

QWidget:: setLayout: попытка установить QLayout "на виджет" ", который уже имеет макет

Я пытаюсь настроить макет виджета вручную с помощью кода (не в Designer), но я делаю что-то неправильно, потому что получаю это предупреждение:

QWidget:: setLayout: Попытка установить QLayout "на виджет" ", у которого уже есть макет

А также макет перепутался (метка сверху, а не внизу).

Это пример кода, который воспроизводит проблему:

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

Ответ 1

Итак, я считаю, что ваша проблема в этой строке:

QHBoxLayout *hlayout = new QHBoxLayout(this);

В частности, я думаю, что проблема заключается в передаче this в QHBoxLayout. Поскольку вы намерены для этого 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);
}

Ответ 2

Проблема заключается в том, что вы создаете макеты с родителем this. Когда вы это сделаете, он устанавливает макет основного макета this. Таким образом, избыточно вызывать setMainLayout().