Название: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой) Отправлено: 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) Название: Re: Виджет динамически меняет размер. Как соответственно менять окно? (с картинкой) Отправлено: xintrea от Октябрь 01, 2008, 16:05 нужно для лэйата верхнего уровня установить свойство Код: setSizeConstraint(QLayout::SetFixedSize) От спасибо, заработало. Но чего никак понять не могу - почему для настройки динамического изменения размера, надо устанавливать 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 или навсегда) |