我有一个容器小部件。
它的大小策略是“固定的”(垂直和水平)。
它定义了setMaxmimumWidth和setMaximumHeight。
我在那里放了一个QHBoxLayout容器。向其添加小部件(也具有固定的宽度/高度)。
但是,当我称“显示”时,这些都不受到尊重。高度几乎是随机的,与布局中的任何内部小部件都不匹配,是最高项目的两倍,并且容器的宽度远远超出了我设置的固定宽度。
我想念什么?为什么容器不能保持我定义的固定宽度/高度?为什么布局会干扰它而不遵守其约束?
最佳答案
混淆来自这样一个事实,即具有固定大小的小部件的确确实具有固定大小。符合以下条件:如果布局仅具有固定大小的窗口小部件,则该布局的整体大小名义上是固定的,并且其中的窗口小部件无法增长。如果将其设置为窗口上的布局,则如果在其上设置SetFixedSize
约束,则可以限制窗口的增长。在仅具有固定大小项目的布局的窗口上设置任何大小策略都是没有用的-除非您希望在小部件之间增加间距。
如果您希望小部件保持固定大小,但它们之间的间距增大为,则下面代码的唯一必要更改是将所有小部件设置为固定大小策略。由于它们无法增长,因此间距是唯一可以做到的。从字面上看,将示例中的所有策略设置为QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)
,您将获得此行为。
如果您希望具有一定最小尺寸且可增长的小部件以及具有一定最小尺寸的整体容器小部件,则只需进行设置即可。这表示:
如果您在容器上设置了最小尺寸,则至少一个小部件将需要沿给定的方向生长。因此,如果在容器上设置宽度,则至少一个布局的小部件必须能够水平扩展以填充它。如果您在容器上设置高度,则至少一个布局小部件必须能够垂直扩展以填充它。
以下在Qt 4.8.5和5.1.1下可以正常工作。窗口可以扩展但不能收缩-窗口具有最小尺寸。您可以将
setMinimumSize
更改为setFixedSize
以获取具有固定大小的窗口,也可以设置最小和最大大小。#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QFontDatabase>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget window;
QHBoxLayout layout(&window);
QLabel lbl1("one");
lbl1.setStyleSheet("QLabel { background-color: #FF8080 }");
lbl1.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
QLabel lbl2("two");
lbl2.setStyleSheet("QLabel { background-color: #80FF80 }");
lbl2.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
lbl2.setMinimumHeight(300);
QLabel lbl3("three");
lbl3.setStyleSheet("QLabel { background-color: #8080FF }");
lbl3.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
lbl3.setMinimumWidth(300);
layout.addWidget(&lbl1);
layout.addWidget(&lbl2);
layout.addWidget(&lbl3);
window.setMinimumSize(800, 800);
// Any combination of setMinimumSize and setMaximumSize is OK.
// If the minimum and maximum are the same, just do setFixedSize
window.show();
return a.exec();
}
关于qt - 如何具有固定大小的布局,同时又可以防止窗口调整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011464/