PySide6.QtQuick.QQuickImageProvider¶
- class QQuickImageProvider¶
QQuickImageProvider
类提供了一个接口,用于在 QML 中支持像素图和线程化图像请求。更多…概要¶
方法¶
def
__init__()
虚拟方法¶
def
requestImage()
def
requestPixmap()
def
requestTexture()
注意
本文档可能包含从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中成功加载图像:
请参阅Image Provider Example以获取完整的实现。请注意,该示例通过插件注册提供程序,而不是像上面所示在应用程序的
main()
函数中注册。可以提供“@nx”高DPI语法。
异步图像加载¶
支持QImage或Texture加载的图像提供程序自动包括对图像异步加载的支持。要为图像源启用异步加载,请将相关Image或BorderImage对象的
asynchronous
属性设置为true
。启用此功能后,对提供程序的图像请求将在低优先级线程中运行,允许在后台执行图像加载,并减少对用户界面性能的影响。为了强制异步加载图像,即使对于没有将
asynchronous
属性设置为true
的图像源,您可以将QQmlImageProviderBase::ForceAsynchronousImageLoading
标志传递给图像提供者构造函数。这确保了所有对该提供者的图像请求都在单独的线程中处理。对于提供QPixmap的图像提供者,异步加载仅在具有ThreadedPixmaps功能的平台上受支持。在只能在主线程中创建pixmap的平台上(即不支持ThreadedPixmaps),如果asynchronous设置为
true
,则该值将被忽略,并且图像将同步加载。对于类型不是ImageResponse的提供者,异步图像加载是基于每个引擎在单个线程上执行的。这意味着一个慢速的图像提供者将阻塞任何其他请求的加载。为了避免这种情况,我们建议使用
QQuickAsyncImageProvider
并通过QThreadPool
或类似方式在提供者端实现线程。请参阅Image Response Provider Example以获取完整的实现。图像缓存¶
由
QQuickImageProvider
返回的图像会自动缓存,类似于QML引擎加载的任何图像。当从缓存中加载带有“image://”前缀的图像时,requestImage()
和requestPixmap()
将不会为相关的图像提供者调用。如果图像应始终从图像提供者获取,并且不应缓存,请将相关Image或BorderImage对象的cache
属性设置为false
。另请参阅
创建一个图像提供者,该提供者将提供给定
type
类型的图像,并根据给定的flags
行为进行操作。- requestImage(id, size, requestedSize)¶
实现此方法以返回带有
id
的图像。默认实现返回一个空图像。id
是请求的图像源,去除了“image:”方案和提供者标识符。例如,如果图像源是“image://myprovider/icons/home”,则给定的id
将是“icons/home”。requestedSize
对应于由图像项请求的 Image::sourceSize。如果requestedSize
是一个有效的大小,返回的图像应该是该大小。在所有情况下,
size
必须设置为图像的原始大小。如果未明确设置这些值,则用于设置相关Image的width和height。注意
此方法可能被多个线程调用,因此请确保此方法的实现是可重入的。
- requestPixmap(id, size, requestedSize)¶
实现此方法以返回带有
id
的像素图。默认实现返回一个空的像素图。id
是请求的图像源,去除了“image:”方案和提供者标识符。例如,如果图像源是“image://myprovider/icons/home”,则给定的id
将是“icons/home”。requestedSize
对应于由图像项请求的 Image::sourceSize。如果requestedSize
是一个有效的大小,返回的图像应该是该大小。在所有情况下,
size
必须设置为图像的原始大小。如果未明确设置这些值,则用于设置相关宽度和高度的图像。注意
此方法可能被多个线程调用,因此请确保此方法的实现是可重入的。
- requestTexture(id, size, requestedSize)¶
- Parameters:
- Return type:
实现此方法以返回具有
id
的纹理。默认实现返回None
。id
是请求的图像源,去除了“image:”方案和提供者标识符。例如,如果图像源是“image://myprovider/icons/home”,则给定的id
将是“icons/home”。requestedSize
对应于由图像项请求的 Image::sourceSize。如果requestedSize
是一个有效的大小,返回的图像应该是该大小。在所有情况下,
size
必须设置为图像的原始大小。如果未明确设置这些值,则用于设置相关Image的width和height。注意
此方法可能被多个线程调用,因此请确保此方法的实现是可重入的。