このページでは

C

Qt Quick Ultralite 計器クラスターの例

Cアプリケーションからユーザーインターフェース要素を制御する方法を示します。

概要

このサンプルでは、C アプリケーションからユーザーインターフェース要素を制御する方法を示します。

Instrument_cluster の例。デジタルスピードメーター、トリップメーター、ウインカーインジケーターを備えた自動車用インストルメントクラスターを示しています。

対象プラットフォーム

プロジェクト構造

instrument_cluster のサンプルは、以下のファイルで構成されています。

  • src/VehicleStatus.cpp
  • src/VehicleStatus.h
  • CMakeLists.txt
  • mcu_instrument_cluster.qmlproject
  • instrument_cluster.qml

CMakeプロジェクトファイルには、アプリケーションのUIを定義する基本的なビルドスクリプト「instrument_cluster.qml 」が含まれています。プロジェクトの設定は「mcu_instrument_cluster.qmlproject 」で定義されています。

これらのファイルに加え、src/simulation フォルダには、AUTOSAR以外のプラットフォーム上でインストルメントクラスターへの入力データを提供するための簡易シミュレータが含まれています:

  • src/simulation/baremetal/main.cpp
  • src/simulation/freertos/main.cpp
  • src/simulator.cpp
  • src/simulator.h

fonts フォルダには、アプリケーションのフォントファイルが含まれています:

  • fonts/TitilliumWeb-Light.ttf
  • fonts/TitilliumWeb-SemiBold.ttf
CMakeプロジェクトファイル

注:シミュレーション ファイルは、AUTOSAR非対応のターゲットに対してのみ追加されます。

# Copyright (C) 2025 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial
cmake_minimum_required (VERSION 3.21.1)

project(instrument_cluster VERSION 0.0.1 LANGUAGES C CXX ASM)
if (NOT TARGET Qul::Core)
    find_package(Qul)
endif()

set(TARGET_SOURCES src/VehicleStatus.cpp)
set(INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(GENERATE_ENTRYPOINT_ARG "")

if(NOT QUL_PLATFORM MATCHES "autosar")
    set(SIMULATOR_DIR src/simulation)
    set(TARGET_SOURCES
        ${TARGET_SOURCES}
        ${SIMULATOR_DIR}/simulator.cpp
        ${SIMULATOR_DIR}/${QUL_OS_LOWERCASE}/main.cpp
    )
    set(INCLUDE_DIRECTORIES
        ${INCLUDE_DIRECTORIES}
        ${CMAKE_CURRENT_SOURCE_DIR}/src/simulation
    )
else()
    set(GENERATE_ENTRYPOINT_ARG GENERATE_ENTRYPOINT)
endif()

qul_add_target(instrument_cluster
    ${TARGET_SOURCES}
    QML_PROJECT mcu_instrument_cluster.qmlproject
    ${GENERATE_ENTRYPOINT_ARG}
)
app_target_setup_os(instrument_cluster)

target_include_directories(instrument_cluster PRIVATE
    ${INCLUDE_DIRECTORIES}
)

if(NOT CMAKE_CROSSCOMPILING AND NOT WIN32)
    add_custom_command(TARGET instrument_cluster
        COMMAND strip instrument_cluster -o instrument_cluster.stripped
        DEPENDS instrument_cluster)
endif()
QmlProject ファイル
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial

import QmlProject 1.3

Project {
    mainFile: "instrument_cluster.qml"

    MCU.Config {
        defaultFontFamily: "Titillium Web"
    }
    FontFiles {
        files: [
            "fonts/TitilliumWeb-Light.ttf",
            "fonts/TitilliumWeb-SemiBold.ttf"
        ]
    }
    QmlFiles {
        files: [
            "instrument_cluster.qml"
        ]
    }
    InterfaceFiles {
        files: ["src/VehicleStatus.h"]
    }
}
VehicleStatus シングルトン

VehicleStatus シングルトンは、ユーザーインターフェース用の車両パラメータを格納する役割を担います。これはQul::Singleton を継承し、QMLに対してパブリックなシグナルとプロパティを公開します。また、Qul::EventQueue を継承し、プロパティ値が変更された際にユーザーインターフェースの更新をトリガーするためのイベントキューを提供します。

    ...
    Qul::Property<int> speed;
    Qul::Property<double> tripMeter;
    Qul::Signal<void(bool leftBlinkerState)> leftBlinkerStateChange;
    Qul::Signal<void(bool rightBlinkerState)> rightBlinkerStateChange;
    ...

QMLコードは、VehicleStatus シングルトンを介してこれらの値にアクセスします:

    ...
    Text {
        id: speedometer
        color: "#2CDE85"
        anchors.centerIn: parent

        font.weight: Font.DemiBold
        font.pixelSize: 90
        text: VehicleStatus.speed
    }
    ...

計器クラスターの再描画は、ダミーのevent queue を使用してトリガーされます。イベント処理には、Qt Quick Ultraliteエンジンによる更新処理が必要です。

...
void qul_application_send_value_change_event()
{
    VehicleStatus::instance().postEvent(true);
}
...

実際のイベントハンドラは何も行いません:

    ...
    void onEvent(const bool &value)
    {
        // Dummy event queue to trigger UI updates
        (void) value;
    }
    ...

C言語のリンク関数は、計器クラスターの内容を制御するために非GUIコードから利用可能です:

...
extern "C" {
void qul_application_set_speed(int speed)
{
    VehicleStatus::instance().speed.setValue(speed);
}
...
AUTOSARの例

AUTOSARプロジェクトでは、Qt Quick のUltraliteComplex Device Driverが、以下に示すようにCリンケージAPIを呼び出します:

#include "VehicleStatus.h"
...
// QUL Complex Device Driver Runnable with a periodic trigger
void Cdd_Qul_Update(void)
{
    int changedValuesCount = 0;

    static int previousSpeed = 0;
    int speed;

    // Read the speed value via the AUTOSAR Interface
    // Rte_Read_Cdd_Qul_Speed(&speed);

    if (speed != previousSpeed) {
        changedValuesCount++;
        qul_application_set_speed(speed);
        previousSpeed = speed;
    }
    ...
    if (changedValuesCount > 0) {
        // Send an event to trigger repainting of the UI
        qul_application_send_value_change_event();
    }

    qul_update_engine(); // Calls Qul::Application::update()
}

ファイル:

C++コードとQMLの統合も参照してください

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