QQuickImageProvider 类
QQuickImageProvider 类提供了一个用于在 QML 中支持位图和线程化图像请求的接口。 更多...
头文件 | #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()) | |
虚拟 | ~QQuickImageProvider() override |
虚拟 QImage | requestImage(const QString &id, QSize *size, const QSize &requestedSize) |
虚拟 QPixmap | requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) |
虚拟 QQuickTextureFactory * | requestTexture(const QString &id, QSize *size, const QSize &requestedSize) |
重写的公共函数
虚拟 QQmlImageProviderBase::Flags | flags() const override |
虚拟 QQmlImageProviderBase::ImageType | imageType() const override |
详细说明
QQuickImageProvider 用于在 QML 应用程序中提供高级图像加载功能。它允许 QML 中的图像
- 使用 QPixmaps 而不是实际的图像文件进行加载
- 在单独的线程中异步加载
要指定应使用图像提供程序加载图像,请使用图像的 URL 源的 "image:" 方案,后跟图像提供者的标识符和请求的图像的标识符。例如
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中可以成功加载图片。
有关完整的实现,请参阅图片提供商示例。注意,示例通过插件注册此提供商,而不是像上面所示地将其在应用程序的main()
函数中注册。
异步图像加载
支持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 表现。
[重写虚拟 noexcept]
QQuickImageProvider::~QQuickImageProvider()
注意:派生类的析构函数需要是线程安全的。
[重写虚拟]
QQmlImageProviderBase::Flags QQuickImageProvider::flags() const
重新实现: QQmlImageProviderBase::flags() const。
返回为此提供器设置的标志。
[重写虚拟]
QQmlImageProviderBase::ImageType QQuickImageProvider::imageType() const
重新实现: QQmlImageProviderBase::imageType() const。
返回此提供器支持的图像类型。
[虚拟]
QImage QQuickImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
实现此方法以返回具有 id 的图像。默认实现返回一个空图像。
id 是请求的图像源,移除了 "image:" 方案和提供器标识符。例如,如果图像 source 为 "image://myprovider/icons/home",则给出的 id 为 "icons/home"。
requestedSize 与 Image 项请求的 Image::sourceSize 对应。如果 requestedSize 是一个有效的大小,返回的图像应具有该大小。
在所有情况下,必须将 size 设置为图像的原始大小。这将用于设置相关 Image 的 width 和 height(如果这些值未明确设置)。
注意:此方法可能由多个线程调用,因此请确保此方法实现是可重入的。
[虚拟]
QPixmap QQuickImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
实现此方法以返回具有 id 的 pixmap。默认实现返回一个空的 pixmap。
id 是请求的图像源,移除了 "image:" 方案和提供器标识符。例如,如果图像 source 为 "image://myprovider/icons/home",则给出的 id 为 "icons/home"。
requestedSize 与 Image 项请求的 Image::sourceSize 对应。如果 requestedSize 是一个有效的大小,返回的图像应具有该大小。
在所有情况下,必须将 size 设置为图像的原始大小。这将用于设置相关 Image 的 width 和 height(如果这些值未明确设置)。
注意:此方法可能由多个线程调用,因此请确保此方法实现是可重入的。
[虚拟]
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 项请求的 Image::sourceSize 对应。如果 requestedSize 是一个有效的大小,返回的图像应具有该大小。
在所有情况下,必须将 size 设置为图像的原始大小。这将用于设置相关 Image 的 width 和 height(如果这些值未明确设置)。
注意:此方法可能由多个线程调用,因此请确保此方法实现是可重入的。
© 2024 Qt 公司有限。包含在其中的文档贡献是各自所有者的版权。此处提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款提供的。Qt 及其相关标志是芬兰和/或全球其他国家的 Qt 公司商标。所有其他商标均为其各自所有者的财产。