Ответ 1
Макет соответствует sizeHint()
и minimalSizeHint()
его дочерних элементов (а не их size()
). Поэтому вы должны переопределить эти два виртуальных метода и вернуть размер, который хотите заставить. Всякий раз, когда меняется подсказка размера, , вы должны вызвать updateGeometry()
в своем виджете, чтобы вызвать обновление макета, в котором размещен виджет.
См. документацию:
virtual QSize QWidget::sizeHint() const
Это свойство содержит рекомендуемый размер для виджета.
[...]
virtual QSize QWidget::minimumSizeHint() const
Это свойство содержит рекомендуемый минимальный размер для виджета.
[...]
QLayout никогда не будет изменять размер виджета до размера, меньшего, чем подсказка минимального размера, если установлено значение minimumSize() или для политики размера задано значение QSizePolicy:: Ignore. Если установлено minimumSize(), подсказка минимального размера будет проигнорирована.
Итак, чтобы установить минимальный размер вашего виджета, выполните minimumSizeHint()
, вернув минимальный размер; до принудительного фиксированного размера, реализуйте оба путем возврата одного и того же размера.
Я также рекомендую прочитать следующий раздел на странице документации "Управление макетами" :
Пользовательские виджеты в макетах
Когда вы создаете свой собственный класс виджетов, вы также должны сообщать о его свойствах макета. Если у виджета есть один из макетов Qt, об этом уже позаботились. Если виджет не имеет дочерних виджетов или использует макет вручную, вы можете изменить поведение виджета, используя любой или все из следующих механизмов:
- Повторите QWidget:: sizeHint(), чтобы вернуть предпочтительный размер виджета.
- Повторить QWidget:: minimumSizeHint(), чтобы вернуть наименьший размер, который может иметь виджете.
- Вызовите QWidget:: setSizePolicy(), чтобы указать требования к пространству виджета.
Вызовите QWidget:: updateGeometry(), когда меняются подсказки размера, политики подсказок минимального размера или размера. Это приведет к перерасчету компоновки. Несколько последовательных вызовов QWidget:: updateGeometry() будут вызывать только один пересчет макета.
Обновить (см. комментарии):
Вы также можете форсировать размер (или только высоту/ширину), вызывая:
QWidget::setFixedSize(QSize);
QWidget::setFixedHeight(int);
QWidget::setFixedWidth(int);
Эти методы просто устанавливают подсказки размера для данного значения и вызывают updateGeometry()
AFAIK. Но, возможно, они немного улучшились с тех пор (как видно из комментариев), это был единственный способ найти проблему здесь.