PySide6.QtQuick.QQuickImageProvider

class QQuickImageProvider

QQuickImageProvider 类提供了一个接口,用于在 QML 中支持像素图和线程化图像请求。更多

PySide6.QtQuick.QQuickImageProvider 的继承图

继承者: QQuickAsyncImageProvider

概要

方法

虚拟方法

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

QQuickImageProvider 用于在QML应用程序中提供高级图像加载功能。它允许QML中的图像:

  • 使用QPixmaps而不是实际的图像文件加载

  • 在单独的线程中异步加载

要指定图像应由图像提供者加载,请使用“image:”方案作为图像的URL源,后跟图像提供者和请求图像的标识符。例如:

这指定了图像应由名为“myimageprovider”的图像提供者加载,并且要加载的图像名为“image.png”。QML引擎根据已通过QQmlEngine::addImageProvider()注册的提供者调用适当的图像提供者。

请注意,标识符是大小写不敏感的,但URL的其余部分将保留大小写传递。例如,下面的代码片段仍然指定图像由名为“myimageprovider”的图像提供者加载,但它将请求与上述代码片段不同的图像(“Image.png”而不是“image.png”)。

如果你希望URL的其余部分不区分大小写,你需要在你的图片提供者内部自行处理。

一个示例

这里有两张图片。它们的source值表明它们应该由一个名为“colors”的图片提供者加载,要加载的图片分别是“yellow”和“red”:

Column {
    Image { source: "image://colors/yellow" }
    Image { source: "image://colors/red" }
}

当这些图像被QML加载时,它会寻找一个匹配的图像提供者并调用其requestImage()requestPixmap()方法(取决于其imageType())来加载图像。该方法被调用时,id参数设置为“yellow”用于第一张图像,设置为“red”用于第二张图像。

这是一个图像提供者的实现,可以加载上述QML请求的图像。该实现动态生成填充了请求颜色的QPixmap图像:

class ColorImageProvider(QQuickImageProvider):

# public
    ColorImageProvider()
    super().__init__(.Pixmap)


    QPixmap requestPixmap(QString id, QSize size, QSize requestedSize) override

       width = 100
       height = 50
       if size:
          size = QSize(width, height)
       QPixmap pixmap(requestedSize.width() > 0 if requestedSize.width() else width,
                      requestedSize.height() > 0 if requestedSize.height() else height)
       pixmap.fill(QColor(id).rgba())
       return pixmap

为了使这个提供者可以在QML中访问,它使用“colors”标识符注册到QML引擎中:

if __name__ == "__main__":

view = QQuickView()
engine = view.engine()
engine.addImageProvider("colors", ColorImageProvider())
view.setSource(QUrl.fromLocalFile("imageprovider-example.qml"))
view.show()
sys.exit(app.exec())

现在可以在QML中成功加载图像:

../../_images/imageprovider.png

请参阅Image Provider Example以获取完整的实现。请注意,该示例通过插件注册提供程序,而不是像上面所示在应用程序的main()函数中注册。

可以提供“@nx”高DPI语法。

异步图像加载

支持QImage或Texture加载的图像提供程序自动包括对图像异步加载的支持。要为图像源启用异步加载,请将相关ImageBorderImage对象的asynchronous属性设置为true。启用此功能后,对提供程序的图像请求将在低优先级线程中运行,允许在后台执行图像加载,并减少对用户界面性能的影响。

为了强制异步加载图像,即使对于没有将asynchronous属性设置为true的图像源,您可以将QQmlImageProviderBase::ForceAsynchronousImageLoading标志传递给图像提供者构造函数。这确保了所有对该提供者的图像请求都在单独的线程中处理。

对于提供QPixmap的图像提供者,异步加载仅在具有ThreadedPixmaps功能的平台上受支持。在只能在主线程中创建pixmap的平台上(即不支持ThreadedPixmaps),如果asynchronous设置为true,则该值将被忽略,并且图像将同步加载。

对于类型不是ImageResponse的提供者,异步图像加载是基于每个引擎在单个线程上执行的。这意味着一个慢速的图像提供者将阻塞任何其他请求的加载。为了避免这种情况,我们建议使用QQuickAsyncImageProvider并通过QThreadPool或类似方式在提供者端实现线程。请参阅Image Response Provider Example以获取完整的实现。

图像缓存

QQuickImageProvider返回的图像会自动缓存,类似于QML引擎加载的任何图像。当从缓存中加载带有“image://”前缀的图像时,requestImage()requestPixmap()将不会为相关的图像提供者调用。如果图像应始终从图像提供者获取,并且不应缓存,请将相关ImageBorderImage对象的cache属性设置为false

另请参阅

addImageProvider()

__init__(type[, flags=QQmlImageProviderBase.Flags()])
Parameters:

创建一个图像提供者,该提供者将提供给定type类型的图像,并根据给定的flags行为进行操作。

requestImage(id, size, requestedSize)
Parameters:
  • id – str

  • sizeQSize

  • requestedSizeQSize

Return type:

QImage

实现此方法以返回带有id的图像。默认实现返回一个空图像。

id 是请求的图像源,去除了“image:”方案和提供者标识符。例如,如果图像是“image://myprovider/icons/home”,则给定的id将是“icons/home”。

requestedSize 对应于由图像项请求的 Image::sourceSize。如果 requestedSize 是一个有效的大小,返回的图像应该是该大小。

在所有情况下,size 必须设置为图像的原始大小。如果未明确设置这些值,则用于设置相关Imagewidthheight

注意

此方法可能被多个线程调用,因此请确保此方法的实现是可重入的。

requestPixmap(id, size, requestedSize)
Parameters:
  • id – str

  • sizeQSize

  • requestedSizeQSize

Return type:

QPixmap

实现此方法以返回带有id的像素图。默认实现返回一个空的像素图。

id 是请求的图像源,去除了“image:”方案和提供者标识符。例如,如果图像是“image://myprovider/icons/home”,则给定的id将是“icons/home”。

requestedSize 对应于由图像项请求的 Image::sourceSize。如果 requestedSize 是一个有效的大小,返回的图像应该是该大小。

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

注意

此方法可能被多个线程调用,因此请确保此方法的实现是可重入的。

requestTexture(id, size, requestedSize)
Parameters:
  • id – str

  • sizeQSize

  • requestedSizeQSize

Return type:

QQuickTextureFactory

实现此方法以返回具有id的纹理。默认实现返回None

id 是请求的图像源,去除了“image:”方案和提供者标识符。例如,如果图像是“image://myprovider/icons/home”,则给定的id将是“icons/home”。

requestedSize 对应于由图像项请求的 Image::sourceSize。如果 requestedSize 是一个有效的大小,返回的图像应该是该大小。

在所有情况下,size 必须设置为图像的原始大小。如果未明确设置这些值,则用于设置相关Imagewidthheight

注意

此方法可能被多个线程调用,因此请确保此方法的实现是可重入的。