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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Масштабирование картинки на QLabel с сохранением отношения cx/cy  (Прочитано 9940 раз)
sasha12345
Гость
« : Август 17, 2012, 12:53 »

Здравтвуйте,

Как заставить QLabel при изменении его размеров масштабировать картинку с сохранением пропорции ширины к высоте?
Записан
lighting
Гость
« Ответ #1 : Август 17, 2012, 13:01 »

Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio
Записан
sasha12345
Гость
« Ответ #2 : Август 17, 2012, 13:58 »

Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio

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

Мне это не нравиться т.к для этого нужно:
1) Или создать наследника QLabel и там перекрыть событие изменения размера. Это не хорошо, если объект QLabel рисуется в дизайнере и соответственно создаётся автоматически. Как подсунуть мой дочерний класс?
2) Или перекрыть событие изменения размера какого-то родителя QLabel и (на всякий случай) пересчитывать размер картинки. Это плохо т.к. везде где будет этот QLabel придётся писать эту логику.
Записан
sasha12345
Гость
« Ответ #3 : Август 17, 2012, 14:08 »

Ещё я думал про вариант пропорционального изменения не картинки на QLabel, а самого QLabel. Но мне так и не удалось с помощью разных лэйаутов и пружинок с одной стороны менять размер QLabel, а с другой стороны менять размер пропорционально.

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

Сообщений: 480



Просмотр профиля
« Ответ #4 : Август 17, 2012, 14:14 »

Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio

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

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

Код
C++ (Qt)
while(!asleep()) sheep++;
sasha12345
Гость
« Ответ #5 : Август 17, 2012, 14:35 »

Используй QPixmap scaled(). и флаг Qt::KeepAspectRatio

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

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

Сообщений: 480



Просмотр профиля
« Ответ #6 : Август 17, 2012, 15:14 »

Если ты будешь менять размер самого  QLabel, размер Pixmap'а, размещенного на QLabel же не изменится. То есть тебе надо то всего ловить событие QEvent::Resize, и соответственно новым размерам QLabel'а изменять размер и картинки. Или я не понял твоего задания ))
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
sasha12345
Гость
« Ответ #7 : Август 17, 2012, 15:28 »

Если ты будешь менять размер самого  QLabel, размер Pixmap'а, размещенного на QLabel же не изменится.
Я установлю scaledContents, т.е. Pixmap будет растянут на весь QLabel
То есть тебе надо то всего ловить событие QEvent::Resize, и соответственно новым размерам QLabel'а изменять размер и картинки.
Если по другому не получится, наверное придётся так и сделать.
Или я не понял твоего задания ))
Думаю понял правильно. Более точно задача в следующем:
Нужно в определённом месте диалогового окна отобразить картинку. причём при изменении размеров диалогового окна её размеры тоже должны меняться, но с сохранение отношения сторон.
Просто для отображения картинки был выбран QLabel и соответственно появились связанные с эти выбором проблеммы.
Записан
Silentium
Гость
« Ответ #8 : Август 21, 2012, 10:39 »

А если просто создать потомка QWidget, как виджет и переопределить в ем метод PaintEvent и встваить потом этот виджет через дизайнер.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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