如何使固定大小的布局也使窗口不会调整大小?

时间:2013-09-25 17:30:03

标签: qt

我有一个容器小部件。

它的尺寸政策是“固定的”(垂直和水平)。 它定义了setMaxmimumWidth和setMaximumHeight。

我在那里放了一个QHBoxLayout容器。添加小部件(具有固定的宽度/高度)。 但是,当我打电话给“显示”时,这一切都没有得到尊重。高度几乎是随机的,与布局中的任何内部小部件都不匹配,是最高项目的两倍,,我的容器的宽度拉伸远远超过我设置的固定宽度。

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

1 个答案:

答案 0 :(得分:26)

混淆来自这样一个事实:具有固定大小的小部件确实具有固定大小。以下是:如果布局只有固定大小的小部件,那么布局的整体大小名义上是固定的,并且其内部的小部件不能增长。如果将其设置为窗口上的布局,则可以在窗口上设置SetFixedSize约束时限制窗口的增长。 在窗口上设置任何类型的大小政策都没用,只有固定大小的项目的布局 - 除非你想在窗口小部件之间增加间距

如果您希望您的小部件保持固定大小,但它们之间的间距增长,则下面代码所需的唯一更改是将所有小部件设置为固定大小策略。由于它们无法生长,因此间距是唯一可以实现的。从字面上将示例中的所有策略设置为QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed),您将获得此行为。

如果您想要某个最小尺寸和可扩展的小部件,以及某个最小尺寸的整个容器小部件,那么只需设置它即可。这意味着:

  1. 在容器小部件上设置最小,最大或固定大小或宽度/高度。

  2. 设置小部件的最小尺寸,最大尺寸或固定尺寸或宽度/高度。

  3. 在窗口小部件上设置大小策略以反映所需的行为。例如,您可能希望某些小部件仅在某些方向上增长,或者根本不增长。

  4. 如果在容器上设置最小大小,则至少有一个小部件需要在给定方向上增长。因此,如果您在容器上设置宽度,则至少一个布局的窗口小部件必须能够水平扩展以填充它。如果在容器上设置高度,则至少一个布局的窗口小部件必须能够垂直展开才能填充它。

    以下在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();
    }