Вопрос по qt, widget, c++, layout – QWidget :: setLayout: Попытка установить QLayout «» в виджете «», который уже имеет макет

14

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

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

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

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

<code>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);
}
</code>
ВАУ, все это работает на простой ошибке: QHBoxLayout * buttonLayout = new QHBoxLayout (); вместо: QHBoxLayout * buttonLayout = new QHBoxLayout (this); user1369511
То же самое с моим в PySide, меняя hl = QtGui.QHBoxLayout (self) на hl = QtGui.QHBoxLayout () gseattle

Ваш Ответ

2   ответа
6

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

16

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

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

Похожие вопросы