Qt 如何有一个固定大小的布局,也保持窗口的大小调整?

Qt 如何有一个固定大小的布局,也保持窗口的大小调整?,qt,Qt,我有一个容器小部件 它的大小策略是“固定的”(垂直和水平)。 它已定义setMaxmimumWidth和setMaximumHeight 我在那里放了一个QHBoxLayout容器。向其中添加小部件(也具有固定的宽度/高度)。 但当我称之为“表演”时,这一切都得不到尊重。高度几乎是随机的,与布局中的任何内部小部件都不匹配,是最高项目的两倍,并且容器的宽度远远超出了我设置的固定宽度。 我错过了什么?为什么容器不能保持我定义的固定宽度/高度?为什么布局会干扰它,而不尊重它的约束?这种混乱来自于一个事

我有一个容器小部件

它的大小策略是“固定的”(垂直和水平)。 它已定义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();
    }
    

    #包括
    #包括
    #包括
    #包括
    #包括
    int main(int argc,char*argv[])
    {
    质量保证申请a(argc、argv);
    QWidget窗口;
    QHBoxLayout布局(窗口和窗口);
    QLabel lbl1(“一”);
    设置样式表(“QLabel{背景色:#FF8080}”);
    lbl1.setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed));
    QLabel lbl2(“两个”);
    设置样式表(“QLabel{背景色:#80FF80}”);
    lbl2.setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed));
    lbl2.设置最小高度(300);
    QLabel lbl3(“三”);
    lbl3.setStyleSheet(“QLabel{背景色:#8080FF}”);
    lbl3.setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed));
    lbl3.设置最小宽度(300);
    layout.addWidget(&lbl1);
    layout.addWidget(&lbl2);
    layout.addWidget(&lbl3);
    窗口设置最小尺寸(800800);
    //setMinimumSize和setMaximumSize的任意组合都可以。
    //如果最小值和最大值相同,只需执行setFixedSize
    window.show();
    返回a.exec();
    }