How to show an image using QGraphicsView without stretching them

55 Views Asked by At


I am trying to display an image using QGraphicsView keeping the same ratio when the window is resized.
i.e. without stretching the image.

Unfortunately I am not succeeding.

I tried searching online a I tried several solutions but none worked.
So I created this mini example so that once solved it will remain a trace of a working solution.

I am using QT 6.6
Any help is welcome!

1

#include <cstdio>
#include <cstdlib>

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QGraphicsScene>
#include <QtWidgets/QGraphicsView>
#include <QtWidgets/QBoxLayout>
#include <QtGui/QWheelEvent>

class viewport_t : public QGraphicsView {

  public:

    QTransform matrixWorld;
    QGraphicsScene * scene;
    QImage image;
    QWidget * windows;

    viewport_t(QWidget * arg) : QGraphicsView(arg) {
      windows = arg;
      image.load("/Users/thewoz/Desktop/Lena.png");
      myScene = new QGraphicsScene(arg);
      setScene(myScene);
    }

    void paintEvent(QPaintEvent * event){
      QPainter myPainter(viewport());
      myPainter.setWorldTransform(matrixWorld);
      QRectF target(0, 0, viewport()->width(), viewport()->height());
      QRectF source(0, 0, image.width(), image.height());
      myPainter.drawImage(target, image, source);
      fitInView(myScene->sceneRect(), Qt::KeepAspectRatio);
      QGraphicsView::paintEvent(event);
    }

    void resizeEvent(QResizeEvent * event) {
      myScene->setSceneRect(0, 0, event->size().width(), event->size().height());
      return QGraphicsView::resizeEvent(event);
    }

};


class window_t : public QWidget {

public:

  QBoxLayout * myGlobalLayout;
  viewport_t * myView;

  window_t() {
    resize(400, 300);
    myGlobalLayout = new QBoxLayout(QBoxLayout::TopToBottom);
    myGlobalLayout->setSizeConstraint(QLayout::SetMinAndMaxSize);
    setLayout(myGlobalLayout);
    myView = new viewport_t(this);
    myGlobalLayout->addWidget(myView, Qt::AlignCenter);
    show();
  }

};


int main( int argc, char** argv ) {
  QApplication app(argc, argv);
  window_t window;
  return app.exec();
}
0

There are 0 best solutions below