24

我有一个容器小部件。

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

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

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

4

1 回答 1

34

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

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

如果您想要某个最小尺寸和可增长的小部件,以及某个最小尺寸的整个容器小部件,那么只需设置它即可。这表示:

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

  2. 在小部件上设置最小、最大或固定尺寸或宽度/高度。

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

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

以下在 Qt 4.8.5 和 5.1.1 下工作正常。窗口可以展开但不能收缩 - 它有一个最小尺寸。您可以将 更改setMinimumSizesetFixedSize以获得具有固定大小的窗口,或者您可以设置最小和最大尺寸。

截屏

#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();
}
于 2013-09-25T17:31:41.000 回答