このページでは

C

Qt Quick Ultralite image_loading の例

実行時に画像を読み込む方法を示します。

概要

このサンプルでは、Qul::ImageProvider およびQul::Image を使用して、実行時に画像を作成・表示する方法を示しています。

「Image_loading」の例。縞模様の旗の画像が表示され、「Load new」ボタンをクリックすると、実行時に新しい画像が生成されます。

画面中央にある縞模様の旗の画像は、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() 関数で行われますが、この関数の実装はBareMetalFreeRTOS:

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.h およびmyimageloader.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::SharedImage 、およびQul::ImageProvider

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