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);
}
Ответы
Ответ 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()
.