我正在尝试使用Qt5编写我的第一个程序。我找到了一个教程(zetcode.com/gui/qt5),其中包含许多示例,这些示例都使用动态布局创建。我正在尝试创建嵌套布局配置,但我在指定布局构造函数的父参数时遇到问题。当我使用主窗口作为主布局及其子布局的父窗口时,我收到一条错误消息,显然告诉我QWidget只能有一个QLayout。窗口看起来还不错,但我还没有实现我的所有功能(插槽和其他代码),所以我不知道什么,如果有的话,已经坏了。如果我省略了子布局中的父参数,我没有得到任何错误消息,窗口看起来也没问题,但我再次想知道这是否会影响我后续的代码添加。
任何人都可以向我解释布局父母的重要性吗?我注意到布局构造函数中父窗口的规范显然是不够的,因为我看到的所有示例都在窗口构造函数的末尾调用了setLayout()。特别是,我遗漏父母会不会引起问题呢?
答案 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);
}
这将正确创建布局层次结构和父/子关系,以便不会泄露任何内容。