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



我正在尝试使用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);
}

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

相关内容

  • 没有找到相关文章

最新更新