Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Октябрь 01, 2008, 14:46



Название: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: xintrea от Октябрь 01, 2008, 14:46
Здравствуйте!


У меня есть виджет, который может менять свой размер. Ну то есть у него может быть два состояния - "свернуто", когда показывается минимум информации, и "развернуто" - когда показывается вся информация.

Когда виджет увеличивается в размерах, размер окна тоже увеличивается чтобы вмещать новый размер виджета. А вот когда виджет уменьшается в размерах, размер окна остается "большим".

(http://i.piccy.kiev.ua/i2/a6/b7/14693bf38409cc92a7ecc5977e14.png)
http://i.piccy.kiev.ua/i2/a6/b7/14693bf38409cc92a7ecc5977e14.png (http://i.piccy.kiev.ua/i2/a6/b7/14693bf38409cc92a7ecc5977e14.png)

Не могу понять, как делать чтоб окно автоматически уменьшалось.

Нужно какой-то сигнал эмиттить? Или какой-то event использовать? Или надо какой-то метод центрального лайоута вызывать чтобы он пересчитал размещение... У меня два лайаута используется - т.е. "внешний" QVBoxLayout содержит QGridLayout и кнопки OK/Cancel. Так вот размер какого layout надо пересчитывать? Если QGridLayout уменьшится, то ведь это не значит что его ячейка в QVBoxLayout тоже уменьшится?

Каждому виджету - "внутреннему", (с QGridLayout) и "внешнему" (с QVBoxLayout) я установил свойства

Код:
setSizePolicy(QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum));

однако окно остается такого же вида, как и на третьем рисунке.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: spirit от Октябрь 01, 2008, 14:59
нужно для лэйата верхнего уровня установить свойство
Код:
setSizeConstraint(QLayout::SetFixedSize)
пример диалога находится QTDIR/examples/dialogs/extension


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: xintrea от Октябрь 01, 2008, 16:05
нужно для лэйата верхнего уровня установить свойство
Код:
setSizeConstraint(QLayout::SetFixedSize)
пример диалога находится QTDIR/examples/dialogs/extension


От спасибо, заработало.

Но чего никак понять не могу - почему для настройки динамического изменения размера, надо устанавливать SetFixedSize? Где тут логика?

Цитировать
QLayout::SetFixedSize

The main widget's size is set to sizeHint(); it cannot be resized at all.

Пробую перевести. Размер основного виджета (видимо того, к которому применяется установка SetFixedSize) устанавливается по принципу sizeHint(); это (что? виджет?) не может изменять размер от всех.

Блин, что же имеется в виду?


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: lit-uriy от Октябрь 01, 2008, 17:09
повсей видимости, он (главный виджет, т.е. на котором этот компоновщик лежит) неможет ресайзится мышкой. Ресайзом управляет функция sizeHint(), наверно так.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: kirill от Октябрь 02, 2008, 05:58

Цитировать
QLayout::SetFixedSize

The main widget's size is set to sizeHint(); it cannot be resized at all.

Пробую перевести. Размер основного виджета (видимо того, к которому применяется установка SetFixedSize) устанавливается по принципу sizeHint(); это (что? виджет?) не может изменять размер от всех.

Блин, что же имеется в виду?


sizeHint - это размер, который менеджер компоновки считает оптимальным. Вот ты пихнул 2 виджета в лайаут - установился определенный размер. Этот размер определяет sizeHint.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: 12d3 от Октябрь 02, 2008, 09:22
QSizePolicy::Fixed - размер виджета всегда такой, который возвращает sizeHint()
QSizePolicy::Minimum - размер виджета не может быть меньше, чем возвращает sizeHint(). А больше - легко может быть. Потому он и оставался увеличенным.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: pastor от Октябрь 02, 2008, 12:55
Небольшая поправка к переводу:

Цитировать
...it cannot be resized at all.

Цитировать
не может изменять размер от всех.

Цитировать
...размер не может быть изменен вовсе.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: crocus13 от Октябрь 03, 2008, 11:55
Это решение для форм основанных на QWidget & QDialog, а как быть если форма от QMainWindow?


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: Hellraiser от Октябрь 03, 2008, 14:23
Ну блин, опять формы! В Qt есть ВИДЖЕТЫ! Базовый класс - QWidget, QDialog и QMainWindow порождены от него. По сути, QMainWindow это QWidget с добавкой статус-бара, тулбара, дока и меню.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: crocus13 от Октябрь 03, 2008, 14:44
и что?


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: Hellraiser от Октябрь 03, 2008, 14:49
а то, что все методы по изменению размеров определены в QWidget. Производные классы их наследуют. Сложности могут возникнуть только с понятием стратегий изменения размера и перестройкой мышления после Дельфи.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: Hellraiser от Октябрь 03, 2008, 15:53
Так переопредели sizeHint  и рассчитай размер. Это будет сумма меню, статус-бара и центрального виджета. Как вариант, центральный виджет строить с использованием Layout.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: Hellraiser от Октябрь 03, 2008, 16:22
кому-то похоже не ясен ответ. четко сказано - в центральном виджете используй Layout's.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: pastor от Октябрь 03, 2008, 16:23
Это решение для форм основанных на QWidget & QDialog, а как быть если форма от QMainWindow?

А в чем проблема использования QMainWindow?


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: crocus от Октябрь 03, 2008, 16:40
Проблемы использования QMainWindow нет, проблема в динамическом изменении размера QMainWindow форм .


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: Hellraiser от Октябрь 03, 2008, 17:00
Чтобы прекратить пустой базар, прикладываю компилябельный тестовый проект. Сейчас под рукой 3.3.8, но принципиальной разницы нет.


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: ритт от Октябрь 04, 2008, 00:34
собрал MainWindowTest под 4.4.2
поведение равно примеру из первого поста.

QMainWindow от QWidget отличается прилично, т.к. у QMainWindow имеется свой встроенный компоновщик, поведение которого несколько отличается от простых компоновщиков как Q((H|V)Box|Grid)Layout.

зы. когда-то я уже задавал вопрос по поводу адекватности использования sizeHint|minimumSizeHint наследниками Qwidget и QMainWindow...ответа до сих пор не нашёл


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: ритт от Октябрь 04, 2008, 06:19
Хэллрайзер, похоже, принципиальная разница всё-таки есть...
приведённый пример во вложении выше (MainWindowTest.zip) под 3.3 работает так, как я предполагаю? - окно открывается минимальным, при разворачивании высота увеличивается, при сворачивании - уменьшается до исходного состояния?
если это так, это либо регресс, либо недокументированное изменение поведение (между мажорками такое возможно)

разбираюсь сейчас с кодом - складывается сильное впечатление, что кеш sizeHint'а не сбрасывается в некоторых ситуациях...если, конечно, так и не задумано троллями...


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: Hellraiser от Октябрь 04, 2008, 08:04
Под 3.3 действительно все работает как надо: уменьшается и увеличивается. Проверил на 4.3.5 - размеры не изменяются. В чем причина, непонятно.  ???  >:(


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: ритт от Октябрь 05, 2008, 14:12
в таком случае давайте дружно считать это регрессией? :)
у меня хитрый фловлэйоут не работает как надо по той же причине...
я подготовил тестовую программу - в понедельник надо бы пообщаться с троллями.

если выложу сорцы, кто-нибудь может погонять этот тест под 4.1.х/4.2.х под линухами и выньдецом?


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: pastor от Октябрь 05, 2008, 14:26
если выложу сорцы, кто-нибудь может погонять этот тест под 4.1.х/4.2.х под линухами и выньдецом?

Могу проверить под 4.1.5, 4.2.3 под виндой, и 4.1.5 под линуксом


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: ритт от Октябрь 05, 2008, 14:44
в аттаче
там в хедере побалуйся дефайнами...

я проверял под 4.3.5/4.4.3/4.5.0 под выньдецом


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: pastor от Октябрь 05, 2008, 15:26
в аттаче
там в хедере побалуйся дефайнами...

я проверял под 4.3.5/4.4.3/4.5.0 под выньдецом

Проверил, неработает


Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой)
Отправлено: ритт от Октябрь 06, 2008, 15:16
придётся создавать таску...так что, на исправление в ближайшем будущем советую не рассчитывать :)
воркэроунда я пока не нашёл...как будет известен номер таски, отпишусь ещё разок...но ветку можно уже откладывать в долгий ящик (примерно до 4.5/5.0 или навсегда)