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

対象プラットフォーム
プロジェクト構造
instrument_cluster のサンプルは、以下のファイルで構成されています。
src/VehicleStatus.cppsrc/VehicleStatus.hCMakeLists.txtmcu_instrument_cluster.qmlprojectinstrument_cluster.qml
CMakeプロジェクトファイルには、アプリケーションのUIを定義する基本的なビルドスクリプト「instrument_cluster.qml 」が含まれています。プロジェクトの設定は「mcu_instrument_cluster.qmlproject 」で定義されています。
これらのファイルに加え、src/simulation フォルダには、AUTOSAR以外のプラットフォーム上でインストルメントクラスターへの入力データを提供するための簡易シミュレータが含まれています:
src/simulation/baremetal/main.cppsrc/simulation/freertos/main.cppsrc/simulator.cppsrc/simulator.h
fonts フォルダには、アプリケーションのフォントファイルが含まれています:
fonts/TitilliumWeb-Light.ttffonts/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()
}ファイル:
- instrument_cluster/CMakeLists.txt
- instrument_cluster/instrument_cluster.qml
- instrument_cluster/mcu_instrument_cluster.qmlproject
- instrument_cluster/src/VehicleStatus.cpp
- instrument_cluster/src/VehicleStatus.h
- instrument_cluster/src/simulation/baremetal/main.cpp
- instrument_cluster/src/simulation/simulator.cpp
- instrument_cluster/src/simulation/simulator.h
「C++コードとQMLの統合」も参照してください 。
特定のQtライセンスの下で利用可能です。
詳細はこちら。