Как ограничить рост QLayout? - PullRequest
       7

Как ограничить рост QLayout?

0 голосов
/ 01 октября 2018

У меня есть QWidget (окно) с QHBoxLayout, который содержит два 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 голосов
/ 02 октября 2018

Причина

Когда размер окна изменяется, что-то должно занять доступное пространство.Поскольку сами кнопки имеют ограниченный размер, расстояние между ними увеличивается.

Решение

Я бы предложил вам добавить невидимый виджет, который будет использоваться в качестве заполнителя.Затем настройте интервал макета соответствующим образом.

Пример

Вот пример, который я подготовил для вас, как изменить код для достижения желаемого эффекта:

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

Альтернативное решение

Чтобы ограничить размер виджета, используйте QWidget::setMinimumSize и QWidget::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);
...