TransWikia.com

Как добавить адаптивное изображение в QLabel?

Stack Overflow на русском Asked by Sazoks on November 24, 2021

Необходимо добавить изображение в один layout в QtDesigner'e, чтобы оно не превышало размеры layout’a. Т.е. при изменении размера окна, layout будет меняться, а с ним и все его компоненты, включая изображение.

Видел решение с помощью QPixmap в QLabel, но там изображение гигантское получается, а мне надо "адаптивное" изображение.

One Answer

В 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP