Изменение размера QGraphicsView в соответствии с загруженным изображением и постоянное сохранение пропорций - PullRequest
2 голосов
/ 22 марта 2020

У меня есть 3 QGraphicsView и 1 QOpenGLWidget, расположенные в QGridLayout в центре, окруженные другими виджетами со всех трех сторон, как показано на пи c ниже:

enter image description here

Все мои виджеты могут быть изменены с помощью QSplitter вокруг них. Как показано в pi c ниже:

enter image description here

Что я хочу:

QGraphicsView всегда должен поддерживать фиксированный размер, эквивалентный размеру изображения. При изменении размера с помощью QSplitter размер представления должен изменяться в зависимости от соотношения сторон изображения, но не самого изображения, как мы можем сравнить в изображениях.

Высота и ширина виджета должны быть рассчитаны на основе ширина и высота изображения.

Например, изображение с разрешением 640px на 480 px всегда должно всегда сохранять размеры.

Что я сделал:

Я использую Qt5.7 на Win 10 P C. Вот пример MVCE, созданный для показа. Я использовал Qt Designer для продвижения виджетов в свой класс ImageView

ImageView.h

// qt
#include <QGraphicsView>
#include <QMouseEvent>
#include <QWidget>
#include <QGraphicsScene>
#include <QResizeEvent>
#include <QShowEvent>
#include <QImage>


class ImageView : public QGraphicsView
{
    Q_OBJECT

public:

    ImageView(QWidget* parent = nullptr);

    void setImage(const QImage& image);

    QGraphicsScene* getScene() const;

protected:

    virtual void mouseMoveEvent(QMouseEvent *event) override;
    virtual void resizeEvent(QResizeEvent *event) override;

private:

    QGraphicsScene* m_scene;

    QImage m_image;
};

ImageView. cpp

#include "imageview.h"
#include <QGraphicsPixmapItem>


ImageView::ImageView(QWidget* parent) :
    QGraphicsView{parent},
    m_scene{new QGraphicsScene(this)}
{
    setScene(m_scene);

    setMouseTracking(true);
}

void ImageView::setImage(const QImage &image)
{
    m_image = image;

    const QPixmap& pixImage = QPixmap::fromImage(image);

    m_scene->addPixmap(pixImage);
}

QGraphicsScene* ImageView::getScene() const
{
    return m_scene;
}

void ImageView::mouseMoveEvent(QMouseEvent *event)
{
    //show the pixel values of the image under the mouse
    if(QGraphicsPixmapItem *item = qgraphicsitem_cast<QGraphicsPixmapItem *>(itemAt(event->pos())))
    {
         QPointF p = item->mapFromScene(mapToScene(event->pos()));
         QPoint pixel_pos = p.toPoint();
         QString toolTipText = "x=" + QString::number(pixel_pos.x()) + "," + " y=" + QString::number(pixel_pos.y());
         setToolTip(toolTipText);
    }

    QGraphicsView::mousePressEvent(event);
}

void ImageView::resizeEvent(QResizeEvent *event)
{
   fitInView(m_scene->itemsBoundingRect(),Qt::KeepAspectRatio);

   QGraphicsView::resizeEvent(event);
}

MainWindow.h

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

MainWindow. cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->graphicsView_2->setImage(QImage(":/images/download.jpg"));
    ui->graphicsView->setImage(QImage(":/images/656780.png"));
    ui->graphicsView_3->setImage(QImage(":/images/download_2.jpg"));
}

MainWindow::~MainWindow()
{
    delete ui;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...