QT5:布局父母的意义是什么?

时间:2016-03-10 21:08:27

标签: layout qt5 parent

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

任何人都可以向我解释布局父母的重要性吗?我注意到布局构造函数中父窗口的规范显然是不够的,因为我看到的所有示例都在窗口构造函数的末尾调用了setLayout()。特别是,我遗漏父母会不会引起问题呢?

1 个答案:

答案 0 :(得分: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);
}

这将正确创建布局层次结构和父/子关系,以便不会泄露任何内容。