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

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

Что я хочу:
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;
}