2016-03-10 2 views
1

Я пытаюсь написать свою первую программу, используя Qt5. Я нашел учебник (zetcode.com/gui/qt5) с рядом примеров, в которых все использовалось динамическое создание макета. Я пытаюсь создать вложенную конфигурацию макета, но у меня возникла проблема с указанием родительского параметра конструктора макета. Когда я использую основное окно в качестве родителя для основного макета и его макетов, я получаю сообщение об ошибке, видимо говоря, что QWidget может иметь только один QLayout. Окно выглядит нормально, но я еще не реализовал все свои функциональные возможности (слоты и другой код), поэтому я не знаю, что, если что-либо, сломано. Если я опускаю родительский параметр из подмакетов, я не получаю сообщений об ошибках, и окно выглядит нормально, но опять же мне интересно, повлияет ли это на мои последующие добавления кода.QT5: В чем значение родителя макета?

Может ли кто-нибудь объяснить мне значение родителя макета? Я заметил, что спецификация родительского окна в конструкторе макета, по-видимому, недостаточна, потому что все примеры, которые я видел, вызывали setLayout() в конце конструктора окна. В частности, мое упущение родителя когда-нибудь вызовет проблемы?

+0

Спасибо @Peppe за подробный ответ. – ghborrmann

ответ

1

«Правила» - это то, что на данном виджете может быть не более одного макета верхнего уровня, а виджетами могут быть только дети других виджетов, не макетов. Так что происходит:

  • Когда вы устанавливаете макет на виджет, виджет будет владеть этим макетом;
  • Когда вы добавляете виджеты в макет, эти виджеты будут перенаправлены на виджет, на который установлен/устанавливается;
  • Когда вы добавляете макет внутри другого макета, внутренний макет становится дочерним элементом внешнего макета.

То, что вы, вероятно, видите, это побочный эффект создания макета с виджетом, как родитель, так как в

QLayout *layout = new SomeLayout(widget); 

Это будет пытаться установить расположение на виджете, и не в случае там уже один. Хорошая новость заключается в том, что вы можете в значительной степени игнорировать прохождение родителей и полагаться на систему, чтобы делать «правильную вещь». Например:

MyWidget::MyWidget(QWidget *parent) 
    : QWidget(parent) 
{ 
    QLayout *mainLayout = new QHBoxLayout; // top level layout 

    QLayout *subLayout1 = new QVBoxLayout; // sub layout 1 stuff 
    QPushButton *button = new QPushButton("button"); 
    subLayout1->addWidget(button); 
    // create more widgets... 
    mainLayout->addLayout(subLayout1); 

    QLayout *subLayout2 = new QVBoxLayout; // sub layout 2 stuff 
    QLineEdit *edit = new QLineEdit; 
    subLayout2->addWidget(edit); 
    mainLayout->addLayout(subLayout2); 

    setLayout(mainLayout); 
} 

Это будет правильно создать иерархию макета и родитель/ребенок отношение, так что ничего не будет просочилась.

Смежные вопросы