QQuickImageProvider 类

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

头文件 #include <QQuickImageProvider>
CMakefind_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmakeQT += quick
继承 QQmlImageProviderBase
继承自

QQuickAsyncImageProvider

公共函数

QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags())
虚拟~QQuickImageProvider() override
虚拟 QImagerequestImage(const QString &id, QSize *size, const QSize &requestedSize)
虚拟 QPixmaprequestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
虚拟 QQuickTextureFactory *requestTexture(const QString &id, QSize *size, const QSize &requestedSize)

重写的公共函数

虚拟 QQmlImageProviderBase::Flagsflags() const override
虚拟 QQmlImageProviderBase::ImageTypeimageType() 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"的图片提供商加载,并分别加载“黄色”和“红色”图片。

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

当这些图片由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或纹理加载的图像提供商自动包含对异步加载图像的支持。要为图像源启用异步加载,请将相关的ImageBorderImage对象的asynchronous属性设置为true。当启用此功能时,对提供商的图像请求将在一个低优先级的线程中运行,允许图像在后台执行加载,从而减少对用户界面的性能影响。

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

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

对于除ImageResponse以外的类型,异步加载是在每个引擎的基础上的单独线程中执行的。这意味着一个慢速的图像提供商会阻塞其他任何请求的加载。为了避免这种情况,建议使用QQuickAsyncImageProvider并在提供程序端通过QThreadPool或类似来实现线程化。请参阅图像响应提供商示例以获取完整的实现。

图像缓存

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

另请参阅QQmlEngine::addImageProvider

成员函数文档

QQuickImageProvider::QQuickImageProvider(QQmlImageProviderBase::ImageType type, QQmlImageProviderBase::Flags flags = Flags())

创建一个图像提供器,该提供器将提供指定 type 的图像并根据指定的 flags 表现。

[重写虚拟 noexcept] QQuickImageProvider::~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 设置为图像的原始大小。这将用于设置相关 Imagewidthheight(如果这些值未明确设置)。

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

[虚拟] 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 设置为图像的原始大小。这将用于设置相关 Imagewidthheight(如果这些值未明确设置)。

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

[虚拟] 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 设置为图像的原始大小。这将用于设置相关 Imagewidthheight(如果这些值未明确设置)。

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

© 2024 Qt 公司有限。包含在其中的文档贡献是各自所有者的版权。此处提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款提供的。Qt 及其相关标志是芬兰和/或全球其他国家的 Qt 公司商标。所有其他商标均为其各自所有者的财产。