我正在尝试使用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);
}
这将正确创建布局层次结构和父/子关系,以便不会泄漏任何内容。