Как resize изображения в Qt?

Я создал class под названием ImageLabel, который расширяет QLabel. Я хочу, чтобы он сохранял соотношение размеров изображения, которое он отображает, независимо от того, насколько он растянут. Он отлично работает, когда вы увеличиваете окно. Проблема возникает, когда вы пытаетесь сделать окно меньше: оно не изменяет размер высоты, оно оставляет его растянутым. Как это исправить?

int ImageLabel::heightForWidth(int width) const { int height = (this->size.height()*width)/this->size.width(); return height; } QSize ImageLabel::sizeHint() const { return this->size; } QSize ImageLabel::minimumSizeHint() const { return QSize(0, 0); } void ImageLabel::setSizePolicy(){ QSizePolicy policy = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); policy.setHeightForWidth(true); QLabel::setSizePolicy(policy); QLabel::setScaledContents(true); } void ImageLabel::setPixmap ( const QPixmap &pixmap ){ this->size = pixmap.size(); QLabel::setPixmap(pixmap); } int main(int argc, char *argv[]){ QApplication a(argc, argv); QFrame *frame = new QFrame; QVBoxLayout *layout = new QVBoxLayout; frame->setLayout(layout); QPixmap map; map.load("test.png"); ImageLabel *label = new ImageLabel; label->setSizePolicy(); label->setPixmap(map); layout->addWidget(label); frame->show(); return a.exec(); } 

Есть несколько способов сделать это, но больше всего я бы рекомендовал, возможно, не бороться с макетной системой, пытаясь намекнуть на аспект. Как вы можете видеть, вам нужно попытаться реализовать ряд методов, пытаясь помочь макету.

Я могу предложить два примера. Ни один из них не использует макеты …

Первый использует дочерний QLabel для отображения изображения и отключает фиксированный размер события изменения размера:

 // imagelabel.h class ImageLabel : public QWidget { Q_OBJECT public: explicit ImageLabel(QWidget *parent = 0); const QPixmap* pixmap() const; public slots: void setPixmap(const QPixmap&); protected: void resizeEvent(QResizeEvent *); private slots: void resizeImage(); private: QLabel *label; }; // imagelabel.cpp ImageLabel::ImageLabel(QWidget *parent) : QWidget(parent) { label = new QLabel(this); label->setScaledContents(true); label->setFixedSize(0,0); } void ImageLabel::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); resizeImage(); } const QPixmap* ImageLabel::pixmap() const { return label->pixmap(); } void ImageLabel::setPixmap (const QPixmap &pixmap){ label->setPixmap(pixmap); resizeImage(); } void ImageLabel::resizeImage() { QSize pixSize = label->pixmap()->size(); pixSize.scale(size(), Qt::KeepAspectRatio); label->setFixedSize(pixSize); } 

Второй пример основан на ответе @Arnold_Spence. Он еще короче, поскольку он не использует дочерний QLabel. Он просто рисует pixmap в событии paint:

 // imagelabel2.h class ImageLabel2 : public QWidget { Q_OBJECT public: explicit ImageLabel2(QWidget *parent = 0); const QPixmap* pixmap() const; public slots: void setPixmap(const QPixmap&); protected: void paintEvent(QPaintEvent *); private: QPixmap pix; }; // imagelabel2.cpp ImageLabel2::ImageLabel2(QWidget *parent) : QWidget(parent) { } void ImageLabel2::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); if (pix.isNull()) return; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QSize pixSize = pix.size(); pixSize.scale(event->rect().size(), Qt::KeepAspectRatio); QPixmap scaledPix = pix.scaled(pixSize, Qt::KeepAspectRatio, Qt::SmoothTransformation ); painter.drawPixmap(QPoint(), scaledPix); } const QPixmap* ImageLabel2::pixmap() const { return &pix; } void ImageLabel2::setPixmap (const QPixmap &pixmap){ pix = pixmap; } 

В QLabel нет встроенного средства для поддержания соотношения сторон изображения. Поскольку Qlabel вероятно, имеет функциональные возможности, которые вам не нужны, вы должны подclassифицировать QWidget и переопределить paintEvent() чтобы сделать изображение так, как вы хотите.

  • cv :: Mat to QImage и обратно
  • Как создать полосу прокрутки в QtQuick 2.0?
  • Как получить STDOUT из QProcess?
  • Рисование прямоугольного наложения на QWidget при щелчке
  • Как эффективно отображать OpenCV-видео в Qt?
  • Qt Creator - Project ERROR: Xcode настроен неправильно. Возможно, вам потребуется подтвердить лицензионное соглашение, запустив / usr / bin / xcodebuild
  • Qt-сигналы (QueuedConnection и DirectConnection)
  • Как выполнить функтор или lambda в заданном streamе в Qt, GCD-стиле?
  • Каков правильный способ реализации QThread ... (пример, пожалуйста ...)
  • Как перенаправить qDebug, qWarning, qCritical etc output?
  • Как включить OpenSSL в проект Qt
  • Interesting Posts

    Как исправить предупреждение о настройке языкового стандарта на Perl?

    Установка Windows XP с USB-накопителя

    mvc Html.BeginForm другая схема URL

    Схема схемы базы данных для системы учета двойной записи?

    Что отличает MainActivity.this от getApplicationContext ()

    VPN-соединение с VirtualBox

    Как определить последний ряд, используемый в VBA, включая пробелы между

    Перенаправление System.out в JTextPane

    изменение яркости экрана в андроиде

    Предупреждения о двойной ошибке указателя в C

    Как узнать идентификатор клиента компонента для обновления / рендеринга ajax? Не удается найти компонент с выражением “foo”, на который ссылается ссылка “bar”

    Тип или имя пространства имен не существует в пространстве имен «System.Web.Mvc»

    Как получить сообщение об ошибке при сбое openstream

    Как раскрасить строки по значению ячейки в OpenOffice и LibreOffice

    Как передать пользовательский тип таблицы как хранимый параметр в C #

    Давайте будем гением компьютера.