Layout 问题5:布局的意义是什么;谁的父母?

Layout 问题5:布局的意义是什么;谁的父母?,layout,qt5,parent,Layout,Qt5,Parent,我正在尝试使用Qt5编写我的第一个程序。我找到了一个教程(zetcode.com/gui/qt5),其中有许多示例,都使用了动态布局创建。我试图创建嵌套布局配置,但在指定布局构造函数的父参数时遇到问题。当我使用主窗口作为主布局及其子布局的父窗口时,会收到一条错误消息,显然是告诉我QWidget只能有一个QLayout。窗口看起来不错,但我还没有实现所有功能(插槽和其他代码),所以我不知道有什么坏了。如果从子布局中省略父参数,则不会收到错误消息,窗口看起来也正常,但我还是想知道这是否会影响后续的代

我正在尝试使用Qt5编写我的第一个程序。我找到了一个教程(zetcode.com/gui/qt5),其中有许多示例,都使用了动态布局创建。我试图创建嵌套布局配置,但在指定布局构造函数的父参数时遇到问题。当我使用主窗口作为主布局及其子布局的父窗口时,会收到一条错误消息,显然是告诉我QWidget只能有一个QLayout。窗口看起来不错,但我还没有实现所有功能(插槽和其他代码),所以我不知道有什么坏了。如果从子布局中省略父参数,则不会收到错误消息,窗口看起来也正常,但我还是想知道这是否会影响后续的代码添加

有人能给我解释一下布局的重要性吗?我注意到,在布局的构造函数中对父窗口的规范显然是不够的,因为我看到的所有示例都在窗口的构造函数末尾调用setLayout()。特别是,我对父控件的省略是否会导致问题?

规则是,给定小部件上最多可以有一个顶级布局,并且小部件只能是其他小部件的子级,而不能是布局的子级。所以发生的是:

  • 当您在小部件上设置布局时,小部件将拥有该布局的所有权
  • 当您在布局上添加小部件时,这些小部件将被重新租给安装布局的小部件
  • 在另一布局中添加布局时,内部布局将成为外部布局的子布局
您可能看到的是以小部件作为父部件创建布局的副作用,如中所示

QLayout *layout = new SomeLayout(widget);

这将尝试在小部件上安装布局,如果已经有布局,则会失败。好消息是,你几乎可以忽略身边的父母,依靠系统做“正确的事情”。例如:

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

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

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

    setLayout(mainLayout);
}

这将正确地创建布局层次结构和父/子关系,这样就不会泄露任何信息。

感谢@Peppe提供了全面的答案。我用QHBoxLayout和QVBoxLayout更正了三行,因此它将编译。我想它以前也编译过吧?好消息是,你几乎可以忽略路过的父母,依靠系统来做“正确的事情”。“有关于这方面的文档吗?可能分散在各地,比如这里。”。