C
Qt Quick ウルトラライト塗装例
Qt Quick Ultralite Application におけるPaintedItem の使用例を示す。
概要
painteditem の例では、PaintedItem Qml タイプを使ってフレームバッファに直接描画しています。これは、カーブしたランプ上の円形のブロブの振動運動をエミュレートするアニメーションを表示します。
この例では、OscillatorPaintedItemクラスを使用しており、paint() メソッドをオーバーライドして、カーブしたランプと円形のブロブを描画しています。paint() メソッドは、100msごとに更新されるangleプロパティの更新イベントごとに呼び出されます。

対象プラットフォーム
プロジェクトの構成
painteditem サンプルは以下のファイルで構成されています:
CMakeLists.txtmcu_painteditem.qmlprojectoscillator.qmlmain_baremetal.cpposcPaintedItem.cpposcPaintedItem.h
CMakeプロジェクト・ファイルには基本的なビルド・スクリプトが含まれています。oscillator.qml 、アプリケーションのUIを定義し、プロジェクト・コンフィギュレーションはmcu_painteditem.qmlprojectで定義されています。
main_baremetal.cpp には、ベアメタルプラットフォーム上でアプリケーションをセットアップするためのメイン関数が含まれています。
oscPaintedItem.h とoscPaintedItem.cpp ファイルには、PaintedItemDelegateクラスから派生したOscillatorPaintedItemクラスの定義が含まれています。
CMakeプロジェクトファイル
# Copyright (C) 2025 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial
cmake_minimum_required (VERSION 3.21.1)
project(painteditem VERSION 0.0.1 LANGUAGES C CXX ASM)
if (NOT TARGET Qul::Core)
find_package(Qul)
endif()
string(TOLOWER ${QUL_PLATFORM} PLATFORM_LOWERCASE)
set (GENERATE_ENTRYPOINT_ARG "")
if (QUL_OS STREQUAL "FreeRTOS")
set(GENERATE_ENTRYPOINT_ARG GENERATE_ENTRYPOINT)
endif()
qul_add_target(painteditem QML_PROJECT mcu_painteditem.qmlproject oscPaintedItem.cpp ${GENERATE_ENTRYPOINT_ARG})
if (PLATFORM_LOWERCASE MATCHES "^rh850" OR PLATFORM_LOWERCASE MATCHES "^tvii")
target_compile_definitions(painteditem PRIVATE NO_TOUCH)
endif()
app_target_setup_os(painteditem)
if (NOT QUL_OS STREQUAL "FreeRTOS")
target_sources(painteditem PRIVATE
main_baremetal.cpp
)
endif()Qmlプロジェクトファイル
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial
import QmlProject 1.3
Project {
mainFile: "oscillator.qml"
InterfaceFiles {
files: [
"oscPaintedItem.h"
]
}
ModuleFiles {
MCU.qulModules: ["Controls"]
}
}PaintedItem
PaintedItem Qml型のdelegate_プロパティはOscillatorPaintedItemインスタンスを指します。
//PaintedItem Object
PaintedItem {
id: oscillator
anchors.right: parent.right
anchors.top: parent.top
anchors.fill: parent
delegate_: OscillatorPaintedItem {
id: delegate
angle: 0.0
initialAngle: 50
pivotLength: 50
onAngleChanged: {
delegate.update()
}
}
}テキスト項目
振動の初期角度と固定減衰係数が左上に表示されます。
Text {
anchors.top: parent.top
anchors.topMargin: 8
anchors.left: parent.left
anchors.leftMargin: 8
text: "Angle: " + delegate.initialAngle + "\ndamping: " + app.dampingFactor
font.pixelSize: 13
}リプレイボタン
振動の角度が0になると、円形の塊は静止状態になります。Replay ボタンを押すと、initialAngleが最大に戻り、アニメーションが再び始まります。
Button {
id: replay
//For platforms not supporting touch input, hide Replay button.
visible: !root.automaticAnimation
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.verticalCenter
height: 40
width: 70
font.pixelSize: 13
text: "Replay"
background: Rectangle {
color: replay.down ? "#A39D9C" : "#B8B3B2"
radius: 8
}
onClicked: {
/*Setting the initialAngle property to maximum value disturbs the equilibrium and
triggers the animation again.*/
delegate.initialAngle = 50
}アニメーションタイマー
アニメーションはangleプロパティで行われ、100msごとに更新されます。angleプロパティが更新されるたびに、デリゲートの更新がトリガーされ、OscillatorPaintedItemのpaint() メソッドが呼び出されます。
Timer {
running: root.automaticAnimation
repeat: true
interval: 8000
onTriggered: delegate.initialAngle = 50
}ファイル