Название: [РЕШЕНО]Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 12, 2014, 14:46 Добрый день всем любителям QT!
Стоит задача: есть 6 картинок разных размеров. Нужно вставить их в виджет вертикально одна за одной, но так, чтобы ширина этих изображений всегда подгонялась под ширину виджета, куда они были вставлены, даже при ресайзе. Проблема также в том, что при ресайзе картинки по горизонтали, она должна ресайзится и по вертикали для сохранения пропорций. В этом случае наступает момент, когда суммарный выртикальный размер 6 картинок становится больше, чем размер виджета, поэтому нужно показывать скролл. Перепробовал scrollArea, переопределил paintEvent - все равно выходит не то. Буду рад любой помощи! Спасибо! Код: class ImageLabel2 : public QWidget Код: ImageLabel2::ImageLabel2(QWidget *parent) : Использую так: Код: QVBoxLayout *scrollWidgetLayout = new QVBoxLayout(ui->scrollArea); Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: Hrundel от Сентябрь 12, 2014, 15:28 Не совсем понятно, в чем именно проблема? В скалировании картинок, или в scrollArea?
Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 12, 2014, 15:41 Не совсем понятно, в чем именно проблема? В скалировании картинок, или в scrollArea? Суть в том, что изображения вроде бы скалируются нормально, но не появляется скролл, а из-за этого уже начинаются проблемы в скалировании - то есть, когда высота картинки достигает 1/6 высоты виджета, то скалирование прекращается, так как при переопределении paintEvent я использую KeepAspectRatio. В коде ui->scrollArea - перенесенный в GUI QScrollWidget через Qt Designer, а ui->scrollAreaWidgetContents - создался автоматически Вот, нарисовал то, что сейчас происходит и то, чего хотелось бы добиться. Картинка большая, осторожно - прошу прощения, не знаю, как спрятать под спойлер. Интуитивно понятно, что проблема кроется в скролле, так как изображения скалируются нормально, но, когда их суммарная высота становится равной размеру виджета (случай 2), то при дальнейшем ресайзе виджета, они перестают скалироваться, так как некуда) Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: Hrundel от Сентябрь 12, 2014, 16:05 Я бы, пожалуй, вместо скорола QGraphicsView использовал.
Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 12, 2014, 16:54 Я бы, пожалуй, вместо скорола QGraphicsView использовал. Мало опыта у меня с ним. Думаю, будет много сложнее разобраться Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: vregess от Сентябрь 12, 2014, 17:31 Я бы использовал классы MVC:
- QListView/QListWidget - для отображения списка картинок (прокрутка будет работать автоматически) - свой делегат QItemDelegate/QStyledItemDelegate - для задания геометрии и рисования картинки Основная работа будет в делегате. Код отрисовывет картинку Код возвращает пропорциональные размеры в зависимости от размера QListView/QListWidget Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: Hrundel от Сентябрь 12, 2014, 18:12 Я бы использовал классы MVC: - QListView/QListWidget - для отображения списка картинок (прокрутка будет работать автоматически) - свой делегат QItemDelegate/QStyledItemDelegate - для задания геометрии и рисования картинки Основная работа будет в делегате. Тоже хороший вариант. Поддерживаю. Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 13, 2014, 02:54 Спасибо большое за ответы - сделал через QListWidget и переопределение делегата
Вот так рисуем наш Item Код: class MyDelegate : public QStyledItemDelegate { Вот так заполняем QListWidget новыми item'ами. Передаю картинку как data в item, чтобы можно было получить ее соотношение сторон и собственно, само изображение Код: QImage image1("1.jpg"); Картинки действительно начинают отлично скейлиться, однако, при этом не скейлятся сами QListWidgetItem'ы - высота не меняется - приложил скриншоты. Плохо соображаю уже в 4 утра - их, получается, тоже нужно переопределять? Если да, то как это сделать? Или, может, нужно просто поиграться с настройками QListWidget? Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: Hrundel от Сентябрь 13, 2014, 10:26 Код
Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 13, 2014, 13:08 Код
Тут немного непонятно - это нужно отлавливать resize-сигнал для QListWidget и внутри него устанавливать sizeHint для каждого item'а? Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: Hrundel от Сентябрь 13, 2014, 13:38 Ну, я бы так попробовал сделать.
Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 13, 2014, 13:54 Ну, я бы так попробовал сделать. тут тогда получается еще одна проблема - реализовать доступ к тому самому желаемому параметру newHeigth - мы же его динамически вычисляем в делегате, а как его передать в resizeEvent? Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: Hrundel от Сентябрь 13, 2014, 14:22 Ну какой-то указатель заделать. Я ведь не вижу твою архитектуру, говорю наобум. Может быть, можно высоту и вне события менять. Например, непосредственно перед самим событием.
Название: Re: Виджет с автоизменяемым размером картинок при ресайзе Отправлено: PavelIgorevich от Сентябрь 13, 2014, 14:49 Вобщем, как подсказал Hrundel, я чуть пошаманил с QListWidget, а именно переопределил его resizeEvent вот так:
Код: class MyQListWidget:public QListWidget Все стало работать отлично! Костыльный метод, но проблему решил! Спасибо Всем за ответы и помощь! Название: Re: [РЕШЕНО]Виджет с автоизменяемым размером картинок при ресайзе Отправлено: vregess от Сентябрь 14, 2014, 20:49 Есть способ лучше
Код
Resize отлавливать придется, но можно все сделать в делегате: Код
Будет работать с любым View-классом. |