Russian Qt Forum
Ноябрь 24, 2024, 08:44
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
[Решено] SizeHint и layout'ы
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [Решено] SizeHint и layout'ы (Прочитано 6513 раз)
andrew.k
Гость
[Решено] SizeHint и layout'ы
«
:
Декабрь 19, 2011, 01:03 »
почему при задании minimumHeight или maximumHeight растягивание в лейауте начинает работать по-другому?
Не пойму.
У меня в вертикальном лейауте два виджета: QListView и наследник QTextEdit с преопределенными sizeHint и minimumSizeHint.
Если не задавать минимальные размеры, то растягивается как нужно (а нужно, чтобы высота виджета изменялась в зависимости о количества строк в нем). Но так же мне нужно ограничить максимальное и минимальное изменение размера.
Сейчас сделал задавая минимальную высоту у ListView.
Но почему не работает с ограничением TextEdit?
Проект во вложении. В исходном виде работает как нужно.
Но если раскомментировать строку sizingtextedit.cpp:15, нужно вписать в 10 раз больше строк, чтобы получить такую же высоту. Лейаут начинает сравнивать сайзхинт и выставлять высоту
пропорционально
. Почему?
Как мне добиться того же поведения и ограничить диапазон высоты?
Тестовый проект во вложении.
«
Последнее редактирование: Декабрь 19, 2011, 16:57 от andrew.k
»
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #1 :
Декабрь 19, 2011, 14:42 »
Что никто не разбирается в лейаутах?
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #2 :
Декабрь 19, 2011, 14:56 »
А что собственно нужно и в чем проблема?
высота меняется...
единственное отличие - если задавать в коде минимальную высоту, по появляются полосы прокрутки, если задать в дизайнере минимальную высоту - то нету полос прокрутки, т.е. элемент получается больше по высоте.
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #3 :
Декабрь 19, 2011, 15:11 »
Цитата: _OLEGator_ от Декабрь 19, 2011, 14:56
А что собственно нужно и в чем проблема?
высота меняется...
единственное отличие - если задавать в коде минимальную высоту, по появляются полосы прокрутки, если задать в дизайнере минимальную высоту - то нету полос прокрутки, т.е. элемент получается больше по высоте.
Если задать в коде минимальную высоту, то 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
QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored.
Поэтому второй случай, когда minimumHeight задан, minimumSizeHint перестает работать. И используется значение sizeHint.
В абсолютном смысле оно одинаковое, но лейаут их по-разному трактует.
Например, для двух строк в 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)
). Вроде бы меня это и интересует. Но опять же не получилось, может я просто запутался. Эспериментировал с разными вариантами. Всегда не то.
«
Последнее редактирование: Декабрь 19, 2011, 15:22 от andrew.k
»
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #4 :
Декабрь 19, 2011, 15:39 »
Помоему слишком мудрено.
Почему бы просто не устанавливать fixedHeight скажем в keyPressEvent?
или использовать родной minimumHeight, без переопределения minimumSizeHint и sizeHint, задавать там же в keyPressEvent...
UPDATE
Похожу где то происходит конфликт внутренней минимальной высоты и переопределенными функциями.
Если использовать свои переменные для минимальной высоты, не используя setMinimumHeight, все работает корректно...
«
Последнее редактирование: Декабрь 19, 2011, 15:49 от _OLEGator_
»
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #5 :
Декабрь 19, 2011, 15:49 »
Цитата: _OLEGator_ от Декабрь 19, 2011, 15:39
Помоему слишком мудрено.
Почему бы просто не устанавливать fixedHeight скажем в keyPressEvent?
или использовать родной minimumHeight, без переопределения minimumSizeHint и sizeHint, задавать там же в keyPressEvent...
Потому что я бы хотел, чтобы ограничения задавались извне виджета.
FixedHeight мне кажется топорным, но пока так и сделал.
Я всегда думал, что sizeHint возвращает значение высоты, а реально что-то вроде "весовых коэффициентов".
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #6 :
Декабрь 19, 2011, 15:52 »
Цитата: _OLEGator_ от Декабрь 19, 2011, 15:39
UPDATE
Похожу где то происходит конфликт внутренней минимальной высоты и переопределенными функциями.
Если использовать свои переменные для минимальной высоты, не используя setMinimumHeight, все работает корректно...
Никакого конфликта нет. Я же описал как это устроено. Смотри цитату про minimumSize.
Когда ты используешь свой minimumHeight, то оригинальный остается не задан и действует minimumSizeHint по описаной схеме.
upd: Опять же использование своего собственного minimumHeight при наличии обычного, мягко говоря не айс.
«
Последнее редактирование: Декабрь 19, 2011, 15:54 от andrew.k
»
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #7 :
Декабрь 19, 2011, 16:06 »
А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров?
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #8 :
Декабрь 19, 2011, 16:12 »
Код
C++ (Qt)
ui
->
verticalLayout
->
setStretch
(
0
,
1
)
;
ui
->
verticalLayout
->
setStretch
(
1
,
0
)
;
Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #9 :
Декабрь 19, 2011, 16:13 »
Цитата: _OLEGator_ от Декабрь 19, 2011, 16:06
А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Ну потому, что я не вижу противоречий в таком подходе, переопределяю, только необходимое.
Я думаю, просто что-то не так делаю. Нужна какая-то рабочая комбинация sizePolicy у всех виджетов в моем контроле.
Мне кажется так.
Цитата: _OLEGator_ от Декабрь 19, 2011, 16:06
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров?
Именно. Высотой с количество строк, но не более и не менее граничных размеров.
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #10 :
Декабрь 19, 2011, 16:21 »
а с этим что?
Код
C++ (Qt)
ui
->
verticalLayout
->
setStretch
(
0
,
1
)
;
ui
->
verticalLayout
->
setStretch
(
1
,
0
)
;
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #11 :
Декабрь 19, 2011, 16:27 »
Цитата: _OLEGator_ от Декабрь 19, 2011, 16:12
Код
C++ (Qt)
ui
->
verticalLayout
->
setStretch
(
0
,
1
)
;
ui
->
verticalLayout
->
setStretch
(
1
,
0
)
;
Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо
Во дела! Похоже и правда работает. И какие будут объяснения?
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #12 :
Декабрь 19, 2011, 16:30 »
Видимо слой каким-то образом меняет фактор растяжения элементов, я в эту сторону не рылся...
Записан
andrew.k
Гость
Re: SizeHint и layout'ы
«
Ответ #13 :
Декабрь 19, 2011, 16:31 »
Цитата: _OLEGator_ от Декабрь 19, 2011, 16:30
Видимо слой каким-то образом меняет фактор растяжения элементов, я в эту сторону не рылся...
Что такое "слой"?
Записан
_OLEGator_
Гость
Re: SizeHint и layout'ы
«
Ответ #14 :
Декабрь 19, 2011, 16:32 »
Мой экспресс перевод)))
Q*BoxLayout
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...