QT5:布局的 Parent 有什么意义?

QT5: What is the Significance of a Layout's Parent?

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

任何人都可以向我解释布局 parent 的重要性吗?我注意到布局构造函数中 parent window 的规范 apparent 是不够的,因为我见过的所有示例都在末尾调用 setLayout() window 的构造函数。特别是,我遗漏 parent 会不会造成问题?

"rules"是在给定的小部件上最多可以有一个顶级布局,并且小部件只能是 children 个其他小部件,不能 的布局。那么会发生什么:

  • 当您在小部件上设置布局时,小部件将取得该布局的所有权;
  • 当您在布局上添加小部件时,这些小部件将被重新parent编辑到安装了布局 is/gets 的小部件;
  • 当您在另一个布局中添加一个布局时,内部布局将成为外部布局的 child。

您可能看到的是 side-effect 使用小部件创建布局的 parent,如

QLayout *layout = new SomeLayout(widget);

这将尝试在小部件上安装布局,如果已经有布局则会失败。好消息是,您几乎可以忽略传递 parent 并依靠系统来执行 "the right thing"。例如:

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

这将正确创建布局层次结构和 parent/child 关系,这样就不会泄露任何内容。