如何创建一个固定大小的布局并防止窗口调整大小?

27

我有一个容器小部件。

它的大小策略是“固定”(垂直和水平均是如此)。 并且已经定义了setMaxmimumWidth和setMaximumHeight。

我在其中放置了一个QHBoxLayout容器,向其中添加带有固定宽度/高度的小部件。 但是当我调用“Show”时,这些都没有被遵守。高度几乎是随机的,不符合布局中任何内部小部件的大小,是最高项大小的两倍,并且我的容器的宽度远远超出了我设置的固定宽度。

我错过了什么?为什么容器不能像我定义的那样保持固定的宽度/高度?为什么布局会干扰它并不尊重其约束条件?

1个回答

33
混淆在于有固定大小的小部件实际上确实具有固定大小。以下事实成立:如果一个布局仅有固定大小的小部件,则布局的整体大小名义上是固定的,并且其中的小部件不能增长。如果你将它设置为窗口上的布局,如果你在其上设置了SetFixedSize约束,则可以限制窗口的增长。除非你想增加小部件之间的间距,否则在只有固定大小项目的布局窗口上设置任何尺寸策略都是无用的。
如果你想让小部件保持固定大小,但间距可以增大,那么下面代码中唯一需要更改的是将所有小部件设置为固定大小策略。由于它们不能增长,因此间距就是唯一能够增长的东西。只需在示例中将所有策略设置为QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)即可获得这种行为。
如果你希望小部件具有某个最小大小并且可增长,并且容器小部件具有某个最小大小,则只需进行相应的设置。这意味着:
1. 在容器小部件上设置最小、最大或固定大小或宽度/高度。 2. 在小部件上设置最小、最大或固定大小或宽度/高度。 3. 根据你想要的行为设置小部件的大小策略。例如,你可能只希望某些小部件在某些方向上增长,或根本不增长。
如果在容器上设置了最小尺寸,则至少有一个小部件需要沿着给定方向增长。因此,如果你在容器上设置了宽度,则至少有一个布局小部件必须能够水平扩展以填充它。如果你在容器上设置了高度,则至少有一个布局小部件必须能够垂直扩展以填充它。
下面的代码在Qt 4.8.5和5.1.1下运行良好。窗口可以扩展但不能收缩 - 它有一个最小大小。你可以将setMinimumSize更改为setFixedSize以获得一个固定大小的窗口,或者你可以同时设置最小和最大大小。 screenshot
#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();
}

如果一个布局只有固定大小的小部件,则该布局的整体大小名义上是固定的,并且其中的小部件无法增长。这些至关重要的话解决了我所有问题。 - Zhuokai Zhao

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