Qt: 布局(layout)和小部件(widget)有什么区别?

10

我认为布局只是一个容器,可以在里面放置更多的小部件。但现在我发现我无法使用addWidget将其添加到其他小部件中。例如如何将布局添加到QSplitter中?

3个回答

7

QWidget内置支持布局,通过layout()setLayout(...)函数。布局对象控制不同子窗口小部件的位置,可以添加到布局中。此外,它会根据指定的约束条件正确调整其父窗口小部件的大小。如果布局尚未有父窗口小部件,则一旦使用setLayout()将布局附加到窗口小部件上,它将设置该父窗口小部件的大小。

但是,有些小部件更像布局管理器而不是小部件,比如QSplitterQTabWidget。例如,考虑QSplitter。虽然它是一个单独的小部件,但它呈现了两个可以操作的不同区域。在这种情况下,为两个不同区域设计一个单一的布局管理器并不合理。与QSplitter类似,QTabWidget具有一些行为使得单一的布局不仅是不必要的,而且是无用的。

我认为上述布局和小部件的融合有时会让布局和小部件的分离变得困惑。


如果你使用了Model-view-controller设计模式的语言,那么说“布局”是控制器是否正确?或者你不能将其与“model-view-controller”设计模式联系起来? - Trevor Boyd Smith
虽然这是一个古老的问题,但在MVC设计模式中,布局是视图的一部分。其目的是解耦模型、视图和控制器。可以轻松更改布局而不需要更改模型或控制器(例如,将项目列表从水平布局更改为垂直布局)。但视图必须随之更改,因为布局是视图的一部分。 - downbeat

4
不,布局不是小部件或容器。布局更像是附加到窗口的“辅助程序”,它可以找到放置每个小部件的最佳位置。
这个来自Qt文档的例子应该会有所帮助(http://qt.nokia.com/doc/4.2/layout.html)。
QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

window->setLayout(layout);
window->show();

4

QLayout 是布局管理器。它们管理父部件内的小部件的定位和调整大小。根据文档:

布局是一种优雅且灵活的自动排列子部件以适应其容器的方式。每个小部件通过 sizeHintsizePolicy 属性向布局报告其尺寸要求,布局会相应地分配可用空间。

例如,将小部件的布局设置为 QHBoxLayout 将导致其子小部件水平布局。
您可以在此处阅读更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接