QQuickImageProvider Class

QQuickImageProvider クラスは、QML で pixmap やスレッド画像要求をサポートするためのインターフェイスを提供します。詳細...

Header: #include <QQuickImageProvider>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
Inherits: QQmlImageProviderBase
Inherited By:

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アプリケーションで高度な画像読み込み機能を提供するために使用されます。QQuickImageProvider は、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の残りの部分を大文字と小文字を区別しないようにしたい場合は、画像プロバイダーの内部で自分で対処する必要があります。

ここに2つの画像があります。それぞれのsource の値は、"colors "という名前の画像プロバイダによって読み込まれることを示し、読み込まれる画像はそれぞれ "yellow "と "red "です:

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

これらの画像がQMLによって読み込まれるとき、QMLは適合する画像プロバイダを探し、そのrequestImage()またはrequestPixmap()メソッド(そのimageType()に依存)を呼び出して画像を読み込みます。このメソッドは、id のパラメータを、最初の画像には "yellow"、2番目の画像には "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で画像を読み込むことができるようになりました:

完全な実装は画像プロバイダの例を参照してください。この例では、上記のようにアプリケーションmain() 関数でプロバイダを登録するのではなく、plugin でプロバイダを登録していることに注意してください。

非同期画像読み込み

QImage または Texture の読み込みをサポートする画像プロバイダは、自動的に画像の非同期読み込みをサポートします。画像ソースの非同期読み込みを有効にするには、関連するImage またはBorderImage オブジェクトのasynchronous プロパティをtrue に設定します。これを有効にすると、プロバイダへの画像要求が優先順位の低いスレッドで実行されるため、画像の読み込みがバックグラウンドで実行され、ユーザー・インターフェースへのパフォーマンスの影響が軽減されます。

asynchronous プロパティがtrue に設定されていない画像ソースでも非同期画像読み込みを強制するには、画像 プロバイダのコンストラクタにQQmlImageProviderBase::ForceAsynchronousImageLoading フラグを渡します。これにより、プロバイダへの画像要求がすべて別スレッドで処理されるようになります。

QPixmap を提供する画像プロバイダの非同期ロードは、ThreadedPixmaps 機能を持つプラットフォームでのみサポートされています。pixmap がメインスレッドでのみ作成できるプラットフォーム(つまり ThreadedPixmaps がサポートされていない)では、asynchronoustrue に設定されている場合、その値は無視され、画像は同期的にロードされます。

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

再リプリメント: () 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::sourceSize に対応する。requestedSize が有効なサイズであれば、返される画像はそのサイズでなければならない。

すべての場合において、size は画像のオリジナルサイズに設定されなければならない。これは、関連するImagewidthheight の値が明示的に設定されていない場合に、これらの値を設定するために使用されます。

注意: このメソッドは複数のスレッドから呼び出される可能性があるので、このメソッドの実装がリエントラントであることを確認してください。

[virtual] 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::sourceSize に対応する。requestedSize が有効なサイズであれば、返される画像はそのサイズでなければならない。

すべての場合において、size は画像のオリジナルサイズに設定されなければならない。これは、関連するImagewidthheight の値が明示的に設定されていない場合に、これらの値を設定するために使用されます。

注意: このメソッドは複数のスレッドから呼び出される可能性があるため、このメソッドの実装がリエントラントであることを確認してください。

[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 は画像のオリジナルサイズに設定されなければならない。これは、関連するImagewidthheight の値が明示的に設定されていない場合に、これらの値を設定するために使用されます。

注意: このメソッドは複数のスレッドから呼び出される可能性があるため、このメソッドの実装がリエントラントであることを確認してください。

©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。