QquickimageProvider :: requestImage图像缩放,如何处理

QQuickImageProvider::requestImage image scaling, how to handle it

本文关键字:何处理 处理 requestImage 图像 缩放 QquickimageProvider      更新时间:2023-10-16

我正在尝试实现一个简单的pximageProvider。源图像是静态的,我只提供一个图像。似乎要求的尺寸总是空的。即使我尝试修改QML侧的图像大小,图像也会重新刻度,但是看起来我的pximageProvider看起来并不像在进行重新缩放...这是正常的吗?

我所做的是实现我的pximageProvider子类,以便当请求时是空的(宽度或高度为空或负数(,我提供了翻转的原始图像(所以我知道我没有进行任何重新缩放(。但是,即使QML侧试图重新列出图像,我也总是看到我的图像翻转(已重新销毁但翻转(。

我的.h头:

#include <QQmlApplicationEngine>
#include <QQuickImageProvider>
#include <QImage>
class MyImageProvider :
    public QQuickImageProvider
{
public:
  MyImageProvider(QQmlApplicationEngine *engine, const QString &qmlId, const QImage *image = Q_NULLPTR);
  QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override;
  void setImage(const QImage &image);
private:
  QImage _image;
};

和我的.cpp:

#include "myimageprovider.h"
MyImageProvider::MyImageProvider(QQmlApplicationEngine *engine, const QString & qmlId, const QImage *image) :
  QQuickImageProvider(QQuickImageProvider::Image)
{
  if (image == Q_NULLPTR) {
    _image = QImage();
  }
  else {
    _image = *image;
  }
  engine->addImageProvider(qmlId, this);
}
QImage MyImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
  // Ignoring the id field, just one image to output
  *size = _image.size();
  if (requestedSize.isEmpty())
    return (_image.mirrored(true, true));
  else
    return (_image.scaled(requestedSize, Qt::KeepAspectRatio));
}
void MyImageProvider::setImage(const QImage &image)
{
  _image = image;
}

我创建一个实例,将其馈送为100x100像素图像。在QML侧:

    Rectangle {
      id: myImageBlock
      color: "grey"
      width: 250
      height: 250
      anchors.centerIn: parent
      Image {
        id: myImage
        source: "image://my_image/unusedId"
        anchors.centerIn: parent
        width: 50
        height: 50
      }
    }

我确实得到了我的图像,在250x250的灰色正方形上正确地缩放到50x50 ...但是图像已翻转,这意味着我的提供商没有缩放图像。这应该如何工作吗?

如文档中所述:

qimage qquickimageProvider :: requestImage(const qString&amp; id,qsize *大小,const qsize&amp; requestSize(

实现此方法以使用ID返回图像。默认实现返回一个空图像。

ID是请求的图像源,带有"图像:"方案和 提供者标识符已删除。例如,如果图像源是 "图片://myprovider/iCons/home",给定的ID将是"图标/家"。

请求的尺寸对应于图像:: sourcesize 图像项。如果要求SYSIZE是有效的大小,则返回图像 应该是那个大小。

在所有情况下,大小都必须设置为图像的原始大小。这 如果这些用于设置相关图像的宽度和高度 值尚未明确设置。

注意:此方法可以通过多个线程调用,因此请确保 该方法的实现是重新进入的。

(强调矿山(

您必须使用ImagesourceSize

Image {
    id: myImage
    source: "image://my_image/unusedId"
    anchors.centerIn: parent
    width: 50
    height: 50
    sourceSize.width: 50  // <---
    sourceSize.height: 50 // <---
}