QGraphicsView 适合任何大小的图像,没有滚动条

Posted

技术标签:

【中文标题】QGraphicsView 适合任何大小的图像,没有滚动条【英文标题】:QGraphicsView fit any size Image without scrollbar 【发布时间】:2017-07-07 13:47:48 【问题描述】:

我的工作环境: Qt 5.8 MSVC2015 64bit, QT GraphicsView, QGraphicsObject, Windows 7 64 bit。

我正在使用 QImage 加载任何大小的图像, 尝试适合固定大小(宽度 200 X 高度 200)的 QGraphicsView。我不想要 QGraphicsView 中的滚动条。

在下面的例子中:

    我的 QGraphicsView 大小将始终固定为宽度 200 X 高度 200。 我的图像大小可能会有所不同,但在下面的代码中我的图像 宽 182 * 高 174。

那么我怎样才能在固定大小的 QGraphicsView 中放置任何图像?

 QImage *ImageData;
 QGraphicsView*  _ThumbNailView = new QGraphicsView(this);
_ThumbNailView->setFixedSize(200, 200);  //QGraphicsView will be alwyas constant.
 QGraphicsScene*    _scene =  new QGraphicsScene();
_scene->setSceneRect(0,0,200,200);
 ..........


 myQGraphicsItem* _thumbsquare = new myQGraphicsItem(imageWidth, imageHeight, ImageData);


 //Load image from buffer
    unsigned char *buffer;   ////some image Data get loaded here. 
    int imageWidth = 182;   //I am getting image Width 182, or any size.
    int imageHeight = 174; //I am getting image Height 174 or any size.
    size_t  size = imageWidth * imageHeight * 3;
    int  bytesPerLine = size / imageHeight;
    QImage* _image = new  QImage(reinterpret_cast<const uchar *>(buffer),182, 174, bytesPerLine, QImage::Format_RGB888);
    _thumbsquare->setMyImage(QImage);

...........    

 int width = _ThumbNailView->geometry().width();    // always const 200
 int height = _ThumbNailView->geometry().height(); // always const 200
_ThumbNailView->resize(width, height);
_scene->addItem(_thumbsquare);
_scene->setSceneRect(_scene->itemsBoundingRect());

// This don't work, make image very small
//_ThumbNailView->fitInView(QRectF(0, 0, 200, 200));

以上代码结果

没有滚动条的预期全匹配图像

非常感谢任何建议或帮助?

【问题讨论】:

Qt5 C++ QGraphicsView: Images don't fit view frame的可能重复 @Eligijus:我尝试了上面的链接来解决我的滚动条问题。但是如果图像宽度小于 200,它不会完全占据 200 宽度。 QRectF 边界 = _scene->sceneRect(); if (bounds.width() fitInView(bounds, Qt::KeepAspectRatio); 【参考方案1】:

@Eligijus,感谢您的帮助,它帮助我找到了解决方案。

我的代码改变了:

QRectF bounds = _scene->sceneRect();
QRectF rect  0,0,200,200;
if (bounds.width() < 200)

    rect .setWidth(bounds.width());
    bounds.setWidth(200);

if (bounds.height() < 200)

    rect.setWidth(bounds.height());
    bounds.setHeight(200);

 _ThumbNailView->fitInView(bounds, Qt::KeepAspectRatio);
 QRectF changeRect  = _scene->sceneRect();
_ThumbNailView->updateGeometry();

但是如果图像大小小于 200,那么你会遇到问题,否则事情会顺利进行。

【讨论】:

以上是关于QGraphicsView 适合任何大小的图像,没有滚动条的主要内容,如果未能解决你的问题,请参考以下文章

CSS使图像调整大小并适合任何屏幕

从相机调整图像大小以适合 Imageview

使网站背景图像适合屏幕大小

调整UIImageView的大小以包装“适合方面”的图像

如何仅使用 CSS/HTML 拉伸/收缩任何尺寸的图像以最适合正方形?

如何在 QGraphicsView::Scale 之后调整 QGraphicsView 的大小