本页内容

QQuickImageProvider Class

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

头文件: #include <QQuickImageProvider>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
继承自: QQmlImageProviderBase
被继承者:

QQuickAsyncImageProvider

公共函数

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 而不是实际的图像文件进行加载
  • 在单独的线程中异步加载

若要指定由图像提供程序加载某张图像,请在图像的 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”的图像提供程序加载,且要加载的图片分别是“yellow”和“red”:

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

当 QML 加载这些图片时,它会查找匹配的图像提供程序,并调用其requestImage() 或requestPixmap() 方法(具体取决于其imageType() 的返回值)来加载图片。调用该方法时,id 参数对于第一张图片设置为“yellow”,对于第二张图片设置为“red”。

以下是一个图像提供程序的实现,它能够加载上述 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 或Texture加载的图像提供程序,会自动支持图像的异步加载。 要为图像源启用异步加载,请将相关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()

销毁QQuickImageProvider

注意: 派生类的析构函数 必须是线程安全的。

[override virtual] QQmlImageProviderBase::Flags QQuickImageProvider::flags() const

重新实现了:QQmlImageProviderBase::flags() const。

返回为此提供程序设置的标志。

[override virtual] QQmlImageProviderBase::ImageType QQuickImageProvider::imageType() const

重写:QQmlImageProviderBase::imageType() const。

返回该提供程序支持的图像类型。

[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 项请求的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 项请求的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 项请求的Image::sourceSize 。如果requestedSize 是有效尺寸,则返回的图像应为该尺寸。

在所有情况下,size 都必须设置为图像的原始尺寸。若相关Image 的width 和height 尚未被显式设置,则该参数将用于设置这些属性。

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

© 2026 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.