#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);
}
将图像添加到布局中是行不通的,它具有不同的专业化。仍然必须与
QLabel.默认情况下,任意缩放图像是
QLabel行不通的,因为在设置图像时,它QLabel设置了它的最小尺寸等于图像的尺寸,所以你需要使用继承来修正它(标签)。头文件 FixPixmapLabel.h:
FitPixmapLabel.cpp 的实现:
接下来,在 QtDesigner 编辑器中,选择任何 QLabel,单击
ПКМ并选择项目"Преобразовать в...",然后在出现的对话框中,在字段中输入"Имя преобразованного класса"我们的类的名称FitPixmapLabel。接下来,以编程方式或在编辑器中的同一位置,我们添加一个图像,该图像将填充标签的所有可用空间,同时保持比例。