QQuickImageProvider Class
QQuickImageProvider 类为支持 QML 中的像素图和线程图像请求提供了一个接口。更多
Header: | #include <QQuickImageProvider> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
qmake: | QT += quick |
继承: | QQmlImageProviderBase |
继承于: |
公共函数
QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags()) | |
virtual | ~QQuickImageProvider() override |
virtual QImage | requestImage(const QString &id, QSize *size, const QSize &requestedSize) |
virtual QPixmap | requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) |
virtual QQuickTextureFactory * | requestTexture(const QString &id, QSize *size, const QSize &requestedSize) |
重新实现的公共函数
virtual QQmlImageProviderBase::Flags | flags() const override |
virtual QQmlImageProviderBase::ImageType | imageType() const override |
详细描述
QQuickImageProvider 用于在 QML 应用程序中提供高级图像加载功能。它允许 QML 中的图像
- 使用 QPixmaps 而不是实际的图像文件加载
- 在单独的线程中异步加载
要指定图像应由图像提供者加载,可使用"image:"(图像)方案来指定图像的 URL 源,然后是图像提供者和请求图像的标识符。例如
Image { source: "image://myimageprovider/image.png" }
这说明图像应由名为 "myimageprovider "的图像提供者加载,要加载的图像名为 "image.png"。QML 引擎会根据通过QQmlEngine::addImageProvider() 注册的提供程序,调用相应的图像提供程序。
请注意,标识符不区分大小写,但传递 URL 的其余部分时会保留大小写。例如,下面的代码段仍将指定图像由名为 "myimageprovider "的图像提供程序加载,但它请求的图像将与上面的代码段不同("image.png "而不是 "image.png")。
Image { source: "image://MyImageProvider/Image.png" }
如果希望 URL 的其余部分不区分大小写,则必须在图像提供程序中自行处理。
示例
下面是两张图片。它们的source
值表示应由名为 "colors "的图像提供程序加载,要加载的图像分别是 "黄色 "和 "红色":
QML 加载这些图片时,会寻找匹配的图片提供程序,并调用其requestImage() 或requestPixmap() 方法(取决于其imageType() 方法)来加载图片。调用该方法时,第一个图片的id
参数设置为 "黄色",第二个图片的 参数设置为 "红色"。
下面是一个图像提供程序实现,可加载上述 QML 请求的图像。该实现动态生成QPixmap 图片,并填充所请求的颜色:
class ColorImageProvider : public QQuickImageProvider { public: ColorImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) { } QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override { int width = 100; int height = 50; if (size) *size = QSize(width, height); QPixmap pixmap(requestedSize.width() > 0 ? requestedSize.width() : width, requestedSize.height() > 0 ? requestedSize.height() : height); pixmap.fill(QColor(id).rgba()); return pixmap; } };
为了让 QML 可以访问该提供程序,我们用 "colors "标识符在 QML 引擎中注册了它:
int main(int argc, char *argv[]) { QQuickView view; QQmlEngine *engine = view.engine(); engine->addImageProvider(QLatin1String("colors"), new ColorImageProvider); view.setSource(QUrl::fromLocalFile(QStringLiteral("imageprovider-example.qml"))); view.show(); return app.exec(); }
现在,图像可以在 QML 中成功加载:
请参阅图像提供程序示例,了解完整的实现过程。请注意,该示例通过plugin 注册提供程序,而不是如上所示在应用程序main()
函数中注册。
可以提供"@nx" high DPI syntax 。
异步图片加载
支持QImage 或纹理加载的图像提供程序会自动支持异步加载图像。要启用图像源的异步加载,请将相关Image 或BorderImage 对象的asynchronous
属性设置为true
。启用异步加载后,向提供者发出的图像请求将在低优先级线程中运行,从而允许在后台执行图像加载,并减少对用户界面性能的影响。
要强制异步加载图片,即使图片来源的asynchronous
属性未设置为true
,也可将QQmlImageProviderBase::ForceAsynchronousImageLoading
标志传递给图片提供程序构造函数。这将确保在单独的线程中处理对提供程序的所有图像请求。
提供QPixmap 的图像提供程序仅在具有 ThreadedPixmaps 功能的平台上支持异步加载,在像素图只能在主线程中创建的平台上(即不支持 ThreadedPixmaps),如果asynchronous 设置为true
,则该值将被忽略,图像将同步加载。
对于 ImageResponse 以外类型的提供程序,异步图片加载是在每个引擎的单线程基础上执行的。这就意味着,速度慢的图像提供程序会阻塞其他请求的加载。为避免这种情况,我们建议使用QQuickAsyncImageProvider ,并通过QThreadPool
或类似程序在提供程序侧实现线程化。请参阅 "图像响应提供程序示例"了解完整的实现过程。
图像缓存
由QQuickImageProvider返回的图像会自动缓存,与QML引擎加载的任何图像类似。当从缓存中加载带有 "image://"前缀的图像时,相关图像提供程序将不会调用requestImage() 和requestPixmap() 。如果图像应始终从图像提供程序获取,而不应被缓存,则应将相关Image 或BorderImage 对象的cache
属性设置为false
。
另请参阅 QQmlEngine::addImageProvider() 。
成员函数文档
QQuickImageProvider::QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags())
创建图像提供程序,该程序将提供给定type 的图像,并按照给定的flags 执行。
[override virtual noexcept]
QQuickImageProvider::~QQuickImageProvider()
注意: 派生类的析构函数必须是线程安全的。
[override virtual]
QQmlImageProviderBase::Flags QQuickImageProvider::flags() const
重实现:QQmlImageProviderBase::flags() 常量。
返回为该提供程序设置的标志。
[override virtual]
QQmlImageProviderBase::ImageType QQuickImageProvider::imageType() const
重实现:QQmlImageProviderBase::imageType() 常量。
返回此提供程序支持的图像类型。
[virtual]
QImage QQuickImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
执行此方法可返回带有id 的图像。默认实现会返回空图像。
id 是请求的图像源,去掉了 "image: "方案和提供商标识符。例如,如果图片source 是 "image://myprovider/icons/home",则给定的id 将是 "icons/home"。
requestedSize 与图像项请求的Image::sourceSize 相对应。如果requestedSize 是一个有效的尺寸,返回的图像就应该是这个尺寸。
在任何情况下,size 都必须设置为图像的原始大小。如果没有明确设置相关Image 的width 和height 值,则使用此方法设置这些值。
注意: 此方法可能会被多个线程调用,因此请确保此方法的实现是可重入的。
[virtual]
QPixmap QQuickImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
执行此方法可返回带有id 的像素图。默认实现会返回一个空像素图。
id 是请求的图像源,去掉了 "image: "方案和提供商标识符。例如,如果图像source 是 "image://myprovider/icons/home",则给定的id 将是 "icons/home"。
requestedSize 与图像项请求的Image::sourceSize 相对应。如果requestedSize 是一个有效的尺寸,返回的图像就应该是这个尺寸。
在任何情况下,size 都必须设置为图像的原始大小。如果没有明确设置相关Image 的width 和height 值,则使用此方法设置这些值。
注意: 此方法可能会被多个线程调用,因此请确保此方法的实现是可重入的。
[virtual]
QQuickTextureFactory *QQuickImageProvider::requestTexture(const QString &id, QSize *size, const QSize &requestedSize)
执行此方法可返回id 的纹理。默认实现返回nullptr
。
id 是请求的图像源,去掉了 "image: "方案和提供者标识符。例如,如果图像source 是 "image://myprovider/icons/home",则给定的id 将是 "icons/home"。
requestedSize 与图像项请求的Image::sourceSize 相对应。如果requestedSize 是一个有效的尺寸,返回的图像就应该是这个尺寸。
在任何情况下,size 都必须设置为图像的原始大小。如果没有明确设置相关Image 的width 和height 值,则使用此方法设置这些值。
注意: 此方法可能会被多个线程调用,因此请确保此方法的实现是可重入的。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.