如何限制QLayout的增长?

时间:2018-10-01 19:47:28

标签: c++ qt layout qt5

我有一个带有QHBoxLayout的QWidget(窗口),其中包含两个QPushButton。 如果我将窗口变大(非常宽),则会发生两件事:

  1. 按钮增长到最大宽度
  2. 按钮之间和周围的空间也会增加。

但是我需要另一种行为:

  1. 小部件可以照常生长和收缩
  2. 按钮之间和周围的空间不应增加(必须恒定)。
  3. 当按钮达到最大宽度时,必须限制小部件的进一步增长

如何达到上述行为?

UPD:

我提出以下代码:

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QWidget wgt;

    QPushButton* button1 = new QPushButton("Button1");
    QPushButton* button2 = new QPushButton("Button2");

    button1->setMinimumSize(150, 100);
    button1->setMaximumSize(250, 100);
    button2->setMinimumSize(150, 100);
    button2->setMaximumSize(250, 100);

    QHBoxLayout* pLayout = new QHBoxLayout(&wgt);
    pLayout->addWidget(button1);
    pLayout->addWidget(button2);

    wgt.setLayout(pLayout);

    wgt.setGeometry(400, 400, 800, 300);
    wgt.show();

    return app.exec();
}

我需要将布局限制为从最小到最大(不能小于最小且不能大于最大)+不能在按钮之间和按钮周围扩展空间(必须具有固定的大小)。

1 个答案:

答案 0 :(得分:1)

原因

调整窗口大小时,必须占用一些可用空间。由于按钮本身的大小受到限制,因此它们之间的空间会增加。

解决方案

我建议您添加一个不可见的小部件以用作占位符。然后相应地调整布局的间距。

示例

这是我为您准备的示例,说明如何更改代码以实现所需的效果:

QHBoxLayout* pLayout = new QHBoxLayout(&wgt);
pLayout->addWidget(button1);
pLayout->addSpacing(6);
pLayout->addWidget(button2);
pLayout->addWidget(new QWidget());
pLayout->setSpacing(0);

替代解决方案

为了限制小部件的大小,请使用QWidget::setMinimumSizeQWidget::setMaximumSize

wgt.setMinimumSize(button1->minimumWidth()
                   + button2->minimumWidth()
                   + pLayout->contentsMargins().left()
                   + pLayout->contentsMargins().right()
                   + pLayout->spacing(),
                   button1->minimumHeight()
                   + pLayout->contentsMargins().top()
                   + pLayout->contentsMargins().bottom()
                   + pLayout->spacing());
wgt.setMaximumSize(button1->maximumWidth()
                   + button2->maximumWidth()
                   + pLayout->contentsMargins().left()
                   + pLayout->contentsMargins().right()
                   + pLayout->spacing(),
                   button1->maximumHeight()
                   + pLayout->contentsMargins().top()
                   + pLayout->contentsMargins().bottom()
                   + pLayout->spacing());

如果您事先知道确切的尺寸,则可以简化为:

wgt.setMinimumWidth(324);
wgt.setMaximumWidth(524);
wgt.setFixedHeight(118);