Russian Qt Forum
Сентябрь 22, 2024, 18:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [Решено] SizeHint и layout'ы  (Прочитано 6390 раз)
andrew.k
Гость
« : Декабрь 19, 2011, 01:03 »

почему при задании minimumHeight или maximumHeight растягивание в лейауте начинает работать по-другому?
Не пойму.
У меня в вертикальном лейауте два виджета: QListView и наследник QTextEdit с преопределенными sizeHint и minimumSizeHint.
Если не задавать минимальные размеры, то растягивается как нужно (а нужно, чтобы высота виджета изменялась в зависимости о количества строк в нем). Но так же мне нужно ограничить максимальное и минимальное изменение размера.
Сейчас сделал задавая минимальную высоту у ListView.

Но почему не работает с ограничением TextEdit?

Проект во вложении. В исходном виде работает как нужно.
Но если раскомментировать строку sizingtextedit.cpp:15, нужно вписать в 10 раз больше строк, чтобы получить такую же высоту. Лейаут начинает сравнивать сайзхинт и выставлять высоту пропорционально. Почему?
Как мне добиться того же поведения и ограничить диапазон высоты?

Тестовый проект во вложении.
« Последнее редактирование: Декабрь 19, 2011, 16:57 от andrew.k » Записан
andrew.k
Гость
« Ответ #1 : Декабрь 19, 2011, 14:42 »

Что никто не разбирается в лейаутах?
Записан
_OLEGator_
Гость
« Ответ #2 : Декабрь 19, 2011, 14:56 »

А что собственно нужно и в чем проблема?
высота меняется...
единственное отличие - если задавать в коде минимальную высоту, по появляются полосы прокрутки, если задать в дизайнере минимальную высоту - то нету полос прокрутки, т.е. элемент получается больше по высоте.
Записан
andrew.k
Гость
« Ответ #3 : Декабрь 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)). Вроде бы меня это и интересует. Но опять же не получилось, может я просто запутался. Эспериментировал с разными вариантами. Всегда не то.
« Последнее редактирование: Декабрь 19, 2011, 15:22 от andrew.k » Записан
_OLEGator_
Гость
« Ответ #4 : Декабрь 19, 2011, 15:39 »

Помоему слишком мудрено.
Почему бы просто не устанавливать fixedHeight скажем в keyPressEvent?
или использовать родной minimumHeight, без переопределения minimumSizeHint и sizeHint, задавать там же в keyPressEvent...

UPDATE
Похожу где то происходит конфликт внутренней минимальной высоты и переопределенными функциями.
Если использовать свои переменные для минимальной высоты, не используя setMinimumHeight, все работает корректно...
« Последнее редактирование: Декабрь 19, 2011, 15:49 от _OLEGator_ » Записан
andrew.k
Гость
« Ответ #5 : Декабрь 19, 2011, 15:49 »

Помоему слишком мудрено.
Почему бы просто не устанавливать fixedHeight скажем в keyPressEvent?
или использовать родной minimumHeight, без переопределения minimumSizeHint и sizeHint, задавать там же в keyPressEvent...
Потому что я бы хотел, чтобы ограничения задавались извне виджета.
FixedHeight мне кажется топорным, но пока так и сделал.

Я всегда думал, что sizeHint возвращает значение высоты, а реально что-то вроде "весовых коэффициентов".
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 19, 2011, 15:52 »

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

upd: Опять же использование своего собственного minimumHeight при наличии обычного, мягко говоря не айс.
« Последнее редактирование: Декабрь 19, 2011, 15:54 от andrew.k » Записан
_OLEGator_
Гость
« Ответ #7 : Декабрь 19, 2011, 16:06 »

А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров?
Записан
_OLEGator_
Гость
« Ответ #8 : Декабрь 19, 2011, 16:12 »

Код
C++ (Qt)
ui->verticalLayout->setStretch(0, 1);
ui->verticalLayout->setStretch(1, 0);

Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо
Записан
andrew.k
Гость
« Ответ #9 : Декабрь 19, 2011, 16:13 »

А зачем тогда использовать родной minimumHeight и переопределенные методы одновременно?
Ну потому, что я не вижу противоречий в таком подходе, переопределяю, только необходимое.
Я думаю, просто что-то не так делаю. Нужна какая-то рабочая комбинация sizePolicy у всех виджетов в моем контроле.
Мне кажется так.
Как я понял ты просто хочешь расширять строку ввода текста по вертикали до допустимых размеров?
Именно. Высотой с количество строк, но не более и не менее граничных размеров.
Записан
_OLEGator_
Гость
« Ответ #10 : Декабрь 19, 2011, 16:21 »

а с этим что?
Код
C++ (Qt)
ui->verticalLayout->setStretch(0, 1);
ui->verticalLayout->setStretch(1, 0);
Записан
andrew.k
Гость
« Ответ #11 : Декабрь 19, 2011, 16:27 »

Код
C++ (Qt)
ui->verticalLayout->setStretch(0, 1);
ui->verticalLayout->setStretch(1, 0);

Вроде как помогает в обоих случаях... Попробуй, вроде бы то что надо
Во дела! Похоже и правда работает. И какие будут объяснения?
Записан
_OLEGator_
Гость
« Ответ #12 : Декабрь 19, 2011, 16:30 »

Видимо слой каким-то образом меняет фактор растяжения элементов, я в эту сторону не рылся...
Записан
andrew.k
Гость
« Ответ #13 : Декабрь 19, 2011, 16:31 »

Видимо слой каким-то образом меняет фактор растяжения элементов, я в эту сторону не рылся...
Что такое "слой"?
Записан
_OLEGator_
Гость
« Ответ #14 : Декабрь 19, 2011, 16:32 »

Мой экспресс перевод)))
Q*BoxLayout
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.243 секунд. Запросов: 21.