Название: [Решено] SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 01:03 почему при задании minimumHeight или maximumHeight растягивание в лейауте начинает работать по-другому?
Не пойму. У меня в вертикальном лейауте два виджета: QListView и наследник QTextEdit с преопределенными sizeHint и minimumSizeHint. Если не задавать минимальные размеры, то растягивается как нужно (а нужно, чтобы высота виджета изменялась в зависимости о количества строк в нем). Но так же мне нужно ограничить максимальное и минимальное изменение размера. Сейчас сделал задавая минимальную высоту у ListView. Но почему не работает с ограничением TextEdit? Проект во вложении. В исходном виде работает как нужно. Но если раскомментировать строку sizingtextedit.cpp:15, нужно вписать в 10 раз больше строк, чтобы получить такую же высоту. Лейаут начинает сравнивать сайзхинт и выставлять высоту пропорционально. Почему? Как мне добиться того же поведения и ограничить диапазон высоты? Тестовый проект во вложении. Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 14:42 Что никто не разбирается в лейаутах?
Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 14:56 А что собственно нужно и в чем проблема?
высота меняется... единственное отличие - если задавать в коде минимальную высоту, по появляются полосы прокрутки, если задать в дизайнере минимальную высоту - то нету полос прокрутки, т.е. элемент получается больше по высоте. Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 15:11 А что собственно нужно и в чем проблема? Если задать в коде минимальную высоту, то TextEdit перестает растягиваться как надо.высота меняется... единственное отличие - если задавать в коде минимальную высоту, по появляются полосы прокрутки, если задать в дизайнере минимальную высоту - то нету полос прокрутки, т.е. элемент получается больше по высоте. Он конечно растягивается, но чтобы получить нужную высоту нужно вписать 20 строк вместо 4. Я пока писал описание немного понял, в чем проблема, но как ее решить пока нет. Суть в том, что у меня переопределяется оба параметра sizeHint и minimumSizeHint. При чем они возвращают одно и тоже. Дальше. Если не задавать minimumHeight, то лейаут резайзит с учетом значения minimumSizeHint, которое меняется как положено. И получаем нужный результат. дальше чатаем: Цитировать QLayout will never resize a widget to a size smaller than the minimum size hint unless minimumSize() is set or the size policy is set to Поэтому второй случай, когда minimumHeight задан, minimumSizeHint перестает работать. И используется значение sizeHint.QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored. В абсолютном смысле оно одинаковое, но лейаут их по-разному трактует. Например, для двух строк в TextEdit я возвращаю 57. Я хочу такю высоту для двух строк. Но второй видже в лейатуе, QListView даже будучи пустым возвращает sizeHint примерно 200. И лейаут делает резайз пропорционально этим значениям. И получаю высоту 30 вместо 57. А мне нужно точно 57. Вот в чем проблема. Я ставил SizePolicy Fixed для TextEdit (The QWidget::sizeHint() is the only acceptable alternative, so the widget can never grow or shrink (e.g. the vertical direction of a push button)). Вроде бы меня это и интересует. Но опять же не получилось, может я просто запутался. Эспериментировал с разными вариантами. Всегда не то. Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 15:39 Помоему слишком мудрено.
Почему бы просто не устанавливать fixedHeight скажем в keyPressEvent? или использовать родной minimumHeight, без переопределения minimumSizeHint и sizeHint, задавать там же в keyPressEvent... UPDATE Похожу где то происходит конфликт внутренней минимальной высоты и переопределенными функциями. Если использовать свои переменные для минимальной высоты, не используя setMinimumHeight, все работает корректно... Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 15:49 Помоему слишком мудрено. Потому что я бы хотел, чтобы ограничения задавались извне виджета.Почему бы просто не устанавливать fixedHeight скажем в keyPressEvent? или использовать родной minimumHeight, без переопределения minimumSizeHint и sizeHint, задавать там же в keyPressEvent... FixedHeight мне кажется топорным, но пока так и сделал. Я всегда думал, что sizeHint возвращает значение высоты, а реально что-то вроде "весовых коэффициентов". Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 15:52 UPDATE Никакого конфликта нет. Я же описал как это устроено. Смотри цитату про minimumSize.Похожу где то происходит конфликт внутренней минимальной высоты и переопределенными функциями. Если использовать свои переменные для минимальной высоты, не используя setMinimumHeight, все работает корректно... Когда ты используешь свой minimumHeight, то оригинальный остается не задан и действует minimumSizeHint по описаной схеме. upd: Опять же использование своего собственного minimumHeight при наличии обычного, мягко говоря не айс. Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:06 А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров? Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:12 Код
Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 16:13 А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно? Ну потому, что я не вижу противоречий в таком подходе, переопределяю, только необходимое.Я думаю, просто что-то не так делаю. Нужна какая-то рабочая комбинация sizePolicy у всех виджетов в моем контроле. Мне кажется так. Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров? Именно. Высотой с количество строк, но не более и не менее граничных размеров.Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:21 а с этим что?
Код
Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 16:27 Код
Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:30 Видимо слой каким-то образом меняет фактор растяжения элементов, я в эту сторону не рылся...
Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 16:31 Видимо слой каким-то образом меняет фактор растяжения элементов, я в эту сторону не рылся... Что такое "слой"?Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:32 Мой экспресс перевод)))
Q*BoxLayout Название: Re: SizeHint и layout'ы Отправлено: andrew.k от Декабрь 19, 2011, 16:34 Мой экспресс перевод))) Спасибо, что откликнулся, кстати. Очень помог.Q*BoxLayout Думаю, можно считать, что тема решена, т.к. требуемый эффект достигнут. Хотя и не очень понятно почему) Про stretch и stretchFactor в ассистенте написано очень мало, поэтому можно только догадки строить. Название: Re: SizeHint и layout'ы Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:38 ну да, как то так.
хитро работают эти Q*BoxLayout |