LINUX.ORG.RU

Как сделать, чтобы QWidget был всегда минимального размера?

 ,


0

1

Здравствуйте! Имеется панель. У нее есть опция expand, при включении которой, панель разворачивается на всю ширину/высоту экрана. Но если ее выключить панель принимает минимально возможный размер, с учетом апплетов, которые на нее помещены. Это прекрасно работает, когда панель статического размера. Но вот если ее размер по какой-либо причине изменился (например, в списке открытых окон появилась новая кнопка или отработала анимация у Launcher’а), то после того, как все вернулось, как было, размер панели не становится снова минимальным, а остается тем, до которого она увеличилась.

Пробовал (пока что на горизонтальной панели только): this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);

Но ни к какому результату это не привело.

Подскажите, пожалуйста, что еще можно попробовать.

UPD: раньше эта проблема решалась перезаданием геометрии панели при каждом изменении ее размера, но хотелось бы найти более легковесное решение



Последнее исправление: thm (всего исправлений: 1)

Пробовал MinimumExpanding? Какой виджет? Я натыкался на то, что внутренние элементы могут блокировать уменьшение размера.

// До изменений
widget->setSizePolicy(..., ...);
widget->show();
QSize size = widget->size();

// После изменений
widget->resize(size);

По идее только так.

Dr64h ★★★
()
Последнее исправление: Dr64h (всего исправлений: 1)
Ответ на: комментарий от Dr64h

Какой виджет?

Само окно панели

widget->resize(size);

Ну, говорю же, раньше было реализовано установкой размера окна на 0x0 при каждом изменении размера окна, что приводит к установке минимально возможного размера в соответствие с заполнением виджета. Но как-то это не легковесно. Хотелось какими-нибудь SizeConstraint, SizePolicy и подобными способами задать такое поведение окна, чтобы оно само поддерживало всегда минимальный размер

thm
() автор топика
Последнее исправление: thm (всего исправлений: 1)

Без скриншотов что то не особо понятно что ты хочешь. Если у тебя увеличивается размер окна и ты хочешь чтоб он уменьшался то вроде такого параметра нет что логично. Если ты хочешь чтоб какой-то виджет на Layout уменьшался после того как был увеличен то посмотри на параметр layoutStretch, обычно достаточно оставить ноль для этого виджета и единицу установить для оставшихся чтоб Layout всегда уменьшал его до минимального размера.

V1KT0P ★★
()
Ответ на: комментарий от thm

мне нужна не фиксированная ширина, а динамически изменяемая

Тогда удваиваю вот этот комментарий. При изменении минимального размера твоего виджета, нужно положить это значение в переменную, возвращаемую функцией sizeHint() и вызвать updateGeometry() (при этом родительский виджет получит событие QEvent::LayoutRequest, по которому его layout manager произведет переразмещение дочерних виджетов).

Но вообще вышесказанное справедливо для виджетов, реализующих размещение дочерних элементов вручную. Если используется layout manager, все по идее должно работать само.

m0rph ★★★★★
()
Ответ на: комментарий от XMs

вы знаете, лучше стало. У меня внутри панели есть рамка QFrame, в которую собственно и добавляются апплеты (есть причина делать так). Я применил это к рамке:

mPanelFrame->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);

и QFrame действительно возвращается к прежнему размеру, но окно - нет (вижу, что QFrame возвращается, как надо, по лишнему месту, которое образуется слева и справа от нее).

Я применил то же самое к самому окну панели: this->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);

Но вот уже это к дополнительному результату не привело. Где-то близко :)

thm
() автор топика

Итак, проблему решил.

Для рамки QFrame, как предложили выше (@XMs):

mPanelFrame->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);

Для Layout’а, в котором находится этот QFrame:

mainLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);

и самой рамке задаем фиксированную высоту или ширину (в зависимости от ориентации панели):

mPanelFrame->setFixedHeight(...);

thm
() автор топика
Последнее исправление: thm (всего исправлений: 1)