Изменение размера изображения Qlabel при изменении размера окна с помощью resizeEvent

Qt/ C++: я хочу использовать ResizeEvent, чтобы получить размер окна и установить для него размер QLabel, чтобы растянуть изображение и адаптировать его к размерам окна. Левым щелчком мыши я могу изменить размер мое окно и изображение принимает новый размер.

1 ответ

Решение

Вы должны иметь следующие соображения:

  • Нет необходимости хранить QPixmap с помощью указателя, поскольку при передаче его в QLabel он копируется по значению.

  • Поэтому, если вы измените размер QPixmap, p не будет отражен в QLabel, поскольку QPixmap, в котором есть QLabel, является копией той, которую вы установили в начале.

  • Нет необходимости использовать макет для этой задачи, так как он создаст бесконечный цикл, так как он также вмешивается в resizeEvent виджета, в котором он был установлен, поэтому, если вы измените размер QLabel, он изменит размер QWidget, и это снова я попытаюсь изменить QLabel, и так далее.

  • Не рекомендуется изменять исходную карту QPixmap, так как изменение ее размера приводит к изменению пикселей, и вы получите неожиданный эффект.

Используя вышеизложенное, мы получаем следующий код:

*.час

#ifndef TESTSIZE_H
#define TESTSIZE_H

#include <QWidget>

class QLabel;

class testsize : public QWidget
{
    Q_OBJECT

public:
    explicit testsize(QWidget *parent = 0);
    ~testsize();

private:
    QLabel *image;
    QPixmap original_px;

protected:
    void resizeEvent(QResizeEvent *event);
};

#endif // TESTSIZE_H

*.cpp

#include "testsize.h"

#include <QLabel>
#include <QResizeEvent>

testsize::testsize(QWidget *parent) :
    QWidget(parent)
{
    image = new QLabel(this);
    original_px = QPixmap(":/wallpaper.jpg");
    image->setPixmap(original_px);
    resize(640, 480);
}

testsize::~testsize()
{
}


void testsize::resizeEvent(QResizeEvent *event)
{
    QPixmap px = original_px.scaled(event->size());
    image->setPixmap(px);
    image->resize(event->size());
    QWidget::resizeEvent(event);
}

Вы можете найти полный пример по следующей ссылке.

Другие вопросы по тегам