Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sasha12345 от Август 17, 2012, 12:53



Название: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: sasha12345 от Август 17, 2012, 12:53
Здравтвуйте,

Как заставить QLabel при изменении его размеров масштабировать картинку с сохранением пропорции ширины к высоте?


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: lighting от Август 17, 2012, 13:01
Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: sasha12345 от Август 17, 2012, 13:58
Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio

Больше никак?

Мне это не нравиться т.к для этого нужно:
1) Или создать наследника QLabel и там перекрыть событие изменения размера. Это не хорошо, если объект QLabel рисуется в дизайнере и соответственно создаётся автоматически. Как подсунуть мой дочерний класс?
2) Или перекрыть событие изменения размера какого-то родителя QLabel и (на всякий случай) пересчитывать размер картинки. Это плохо т.к. везде где будет этот QLabel придётся писать эту логику.


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: sasha12345 от Август 17, 2012, 14:08
Ещё я думал про вариант пропорционального изменения не картинки на QLabel, а самого QLabel. Но мне так и не удалось с помощью разных лэйаутов и пружинок с одной стороны менять размер QLabel, а с другой стороны менять размер пропорционально.

Т.е., задача примерно следующая:
Есть два виджета - один в другом. При изменении размера внешнего виджета, внутренний должен менять свой размер так, чтобы занимать максимум пространства внешнего, но сохраняя пропорции своих сторон.
Так можно сделать?


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: Kurles от Август 17, 2012, 14:14
Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio

Больше никак?

Мне это не нравиться т.к для этого нужно:
1) Или создать наследника QLabel и там перекрыть событие изменения размера. Это не хорошо, если объект QLabel рисуется в дизайнере и соответственно создаётся автоматически. Как подсунуть мой дочерний класс?
Либо использовать в дизайнере promoteTo... наследуемый класс от QLabel, либо дополнительный класс с переопределенным eventFilter, и вызова в конструкторе формы ui->label->installEventFilter(new ДополнительныйКлаас());


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: sasha12345 от Август 17, 2012, 14:35
Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio

Больше никак?

Мне это не нравиться т.к для этого нужно:
1) Или создать наследника QLabel и там перекрыть событие изменения размера. Это не хорошо, если объект QLabel рисуется в дизайнере и соответственно создаётся автоматически. Как подсунуть мой дочерний класс?
Либо использовать в дизайнере promoteTo... наследуемый класс от QLabel, либо дополнительный класс с переопределенным eventFilter, и вызова в конструкторе формы ui->label->installEventFilter(new ДополнительныйКлаас());
Понятно. А с лэйаутами, как я написал чуть выше, тоже не получится?
Я тут откопал ф-ю QSizePolicy::setHeightForWidth(). Но что-то не помогает. или это не то?


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: Kurles от Август 17, 2012, 15:14
Если ты будешь менять размер самого  QLabel, размер Pixmap'а, размещенного на QLabel же не изменится. То есть тебе надо то всего ловить событие QEvent::Resize, и соответственно новым размерам QLabel'а изменять размер и картинки. Или я не понял твоего задания ))


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: sasha12345 от Август 17, 2012, 15:28
Если ты будешь менять размер самого  QLabel, размер Pixmap'а, размещенного на QLabel же не изменится.
Я установлю scaledContents, т.е. Pixmap будет растянут на весь QLabel
То есть тебе надо то всего ловить событие QEvent::Resize, и соответственно новым размерам QLabel'а изменять размер и картинки.
Если по другому не получится, наверное придётся так и сделать.
Или я не понял твоего задания ))
Думаю понял правильно. Более точно задача в следующем:
Нужно в определённом месте диалогового окна отобразить картинку. причём при изменении размеров диалогового окна её размеры тоже должны меняться, но с сохранение отношения сторон.
Просто для отображения картинки был выбран QLabel и соответственно появились связанные с эти выбором проблеммы.


Название: Re: Масштабирование картинки на QLabel с сохранением отношения cx/cy
Отправлено: Silentium от Август 21, 2012, 10:39
А если просто создать потомка QWidget, как виджет и переопределить в ем метод PaintEvent и встваить потом этот виджет через дизайнер.