このページでは

C

Qt Quick Ultralite image_loading サンプル

実行時に画像をロードする方法を示す。

概要

この例では、Qul::ImageProviderQul::Image を使って、実行時に画像を作成して表示する方法を示します。

画面中央の縞模様の旗の画像は、Load new! ボタンが押されたときにランダムな色合いで作成される。

対象プラットフォーム

プロジェクト構成

CMake プロジェクト・ファイル

FreeRTOS configTOTAL_HEAP_SIZE 変数に、ヒープ上に画像を保存するのに十分な値を設定します。

if (QUL_OS STREQUAL "FreeRTOS" AND NOT QUL_PLATFORM MATCHES "^mimxrt1170")
    qul_override_freertos_heap_size(image_loading "300 * 1024")
endif()

アプリケーションは、カスタム画像プロバイダを登録する必要があります。これはmain() 関数で行います。BareMetal と は異なります。 FreeRTOS:

if (QUL_OS STREQUAL "FreeRTOS")
    target_sources(image_loading PRIVATE
                   main_freertos.cpp
    )
else()
    target_sources(image_loading PRIVATE
                   main_baremetal.cpp
    )
endif()
アプリケーションUI

image_loading.qmlファイルはユーザー・インターフェースを定義します。

動的画像は、source プロパティが画像プロバイダ URI に設定されたImage アイテムを使用して表示されます。

        Image {
            anchors.horizontalCenter: parent.horizontalCenter

            // Trigger a new image to be loaded when root.imageName changes
            source: "image://myimageprovider/" + root.imageName
            width: 120
            height: 120
        }
画像プロバイダ

MyImageProvider 画像プロバイダは、myimageloader.hmyimageloader.cpp で実装されています。

MyImageProvider::requestImage() メソッドは、まず画像URIを解析し、新しいQul::Image を割り当て、書き込みの準備をします:

Qul::SharedImage MyImageProvider::requestImage(const char *imageName, size_t imageNameLength)
{
    if (imageNameLength < 8)
        return Qul::SharedImage();

    // Parse the image name to determine the colors to use for the image
    colors[0] = imageName[5] - '0';
    colors[1] = imageName[6] - '0';
    colors[2] = imageName[7] - '0';

    loadSteps = 3;
    currentLoadStep = 0;

    // Create the image and mark it as being-written-to
    Qul::Image img(120, 120, Qul::PixelFormat_RGB16);
    sharedImage = img;
    img.beginWrite();

そして、画像を時間経過とともに更新する書き込み操作を開始する。この例では、タイマーを使ってこれを行います。実際には、アプリケーションは非同期プロセスを起動し、画像をフェッチしてデコードしたり、画像に対して描画処理を実行したりします。

書き込み操作が完了すると、Qul::EventQueue にイベントが送信され、画像の準備ができたことが通知されます。

void MyImageProvider::onEvent(MyImageLoadedEvent *const &event)
{
    // Causes the finished image to become visible.
    event->sharedImage.image()->endWrite();
    Qul::PlatformInterface::qul_delete(event);
}

画像プロバイダはmain() 関数でアプリケーションに登録されます。

int main()
{
    Qul::initHardware();
    MyImageProvider myImageProvider;
    Qul::Application app;
    app.addImageProvider("myimageprovider", &myImageProvider);
    ...

ファイル

Qul::ImageQul::SharedImageQul::ImageProviderも参照

特定の Qt ライセンスの下で利用可能です。
詳細はこちら。