Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Декабрь 19, 2011, 01:03



Название: [Решено] 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
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)). Вроде бы меня это и интересует. Но опять же не получилось, может я просто запутался. Эспериментировал с разными вариантами. Всегда не то.


Название: 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
Похожу где то происходит конфликт внутренней минимальной высоты и переопределенными функциями.
Если использовать свои переменные для минимальной высоты, не используя setMinimumHeight, все работает корректно...
Никакого конфликта нет. Я же описал как это устроено. Смотри цитату про minimumSize.
Когда ты используешь свой minimumHeight, то оригинальный остается не задан и действует minimumSizeHint по описаной схеме.

upd: Опять же использование своего собственного minimumHeight при наличии обычного, мягко говоря не айс.


Название: Re: SizeHint и layout'ы
Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:06
А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров?


Название: Re: SizeHint и layout'ы
Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:12
Код
C++ (Qt)
ui->verticalLayout->setStretch(0, 1);
ui->verticalLayout->setStretch(1, 0);

Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо


Название: Re: SizeHint и layout'ы
Отправлено: andrew.k от Декабрь 19, 2011, 16:13
А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Ну потому, что я не вижу противоречий в таком подходе, переопределяю, только необходимое.
Я думаю, просто что-то не так делаю. Нужна какая-то рабочая комбинация sizePolicy у всех виджетов в моем контроле.
Мне кажется так.
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров?
Именно. Высотой с количество строк, но не более и не менее граничных размеров.


Название: Re: SizeHint и layout'ы
Отправлено: _OLEGator_ от Декабрь 19, 2011, 16:21
а с этим что?
Код
C++ (Qt)
ui->verticalLayout->setStretch(0, 1);
ui->verticalLayout->setStretch(1, 0);


Название: Re: SizeHint и layout'ы
Отправлено: andrew.k от Декабрь 19, 2011, 16:27
Код
C++ (Qt)
ui->verticalLayout->setStretch(0, 1);
ui->verticalLayout->setStretch(1, 0);

Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо
Во дела! Похоже и правда работает. И какие будут объяснения?


Название: 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