Stack Overflow на русском Asked by Sazoks on November 24, 2021
Необходимо добавить изображение в один layout в QtDesigner'e
, чтобы оно не превышало размеры layout’a. Т.е. при изменении размера окна, layout будет меняться, а с ним и все его компоненты, включая изображение.
Видел решение с помощью QPixmap
в QLabel
, но там изображение гигантское получается, а мне надо "адаптивное"
изображение.
В layout добавить изображение не получится, у него другая специализация. Все-таки придется поработать с QLabel
.
По умолчанию произвольно масштабировать изображение в QLabel
не получится, потому что при установке изображения, QLabel
устанавливает свой минимальный размер равный размеру изображения, поэтому надо ее (метку) подправить с помощью наследования.
Заголовочный файл FixPixmapLabel.h:
#include <QLabel>
#include <QResizeEvent>
class FitPixmapLabel : public QLabel {
Q_OBJECT
public:
FitPixmapLabel(QWidget* parent = nullptr);
// Метод возвращающий минимальный размер метки
// Если в метке есть изображение, то возвращает его размер
// а нам надо, чтобы было QSize(0, 0), поэтому переопределяем
QSize minimumSizeHint() const override;
protected:
// Переопределяем метод изменения размера метки, в котором будем
// подгонять наше изображение к новому размеру метки
void resizeEvent(QResizeEvent* event) override;
};
Реализация FitPixmapLabel.cpp:
#include "FitPixmapLabel.h"
FitPixmapLabel::FitPixmapLabel(QWidget* parent = nullptr) :
QLabel(parent)
{
}
QSize FitPixmapLabel::minimumSizeHint() const {
return QSize(0, 0);
}
void FitPixmapLabel::resizeEvent(QResizeEvent* event) {
// Статический объект source нужен, чтобы хранить изначальное,
// неиспорченное множеством трансформаций, изображение
static QPixmap source;
// Инициализируем source
if ( source.isNull() && pixmap() != nullptr )
source = QPixmap(*pixmap());
if( !source.isNull() ) {
// Гладенько трансформируем изображение под новый размер метки
// с сохранением пропорций (если не надо то, замените Qt::KeepAspectRatio на что-нибудь другое)
QPixmap p = source.scaled(event->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
// Обновляем изображение в метке
setPixmap(p);
}
QLabel::resizeEvent(event);
}
Далее, в редакторе QtDesigner выбираем любой QLabel, нажимаем ПКМ
и выбираем пункт "Преобразовать в..."
и далее, в появившемся диалоге, вводим в поле "Имя преобразованного класса"
имя нашего класса FitPixmapLabel
. Далее, либо программно, либо там же в редакторе добавляем изображение, которое будет заполнять все свободное пространство метки, сохраняя пропорции.
Answered by Alexander Chernin on November 24, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP