SCXML 信号機 (動的、QML)
動的にロードされるステートマシンを使って信号機を実装するQt Quick アプリケーションです。
Traffic Light QML は、動的にロードされるステートマシンの状態のアクティブプロパティに接続する方法を示します。
UIはQt Quick を使って作成されています。
例の実行
この例を実行するには Qt Creatorからサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Exampleを参照してください。
ステートマシンの動的ロード
サンプルのビルドファイルに以下の行を追加することで、Qt SCXML モジュールにリンクします。
qmakeを使用する場合は.proに:
QT += qml scxml
cmakeを使用する場合はCMakeLists.txtに:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Scxml) target_link_libraries(trafficlight-qml-dynamic PRIVATE Qt6::Core Qt6::Gui Qt6::Qml Qt6::Scxml )
メインのQMLファイルにステートマシンを動的に作成します:
import QtScxml import TrafficLightApplication Window { width: lights.width height: lights.height visible: true Lights { id: lights stateMachine: loader.stateMachine // Suppress qmllint warning, dynamic statemachine properties not known at compile-time // qmllint disable missing-property button.source: stateMachine.working ? "pause.png" : "play.png" button.onClicked: stateMachine.submitEvent(stateMachine.working ? "smash" : "repair"); // qmllint enable missing-property } StateMachineLoader { id: loader source: Qt.resolvedUrl("statemachine.scxml") } }
ステートへの接続
SCXML ファイルで、それぞれのライトの状態を指定します。<onentry>
要素で、状態に入ったときに送るイベントと、イベントを送るまでの遅延時間(秒)を指定します。<transition>
要素では、target
属性で指定された状態への遷移をトリガーするイベントを指定します:
<state id="red"> <onentry> <send event="startGoingGreen" delay="3s"/> </onentry> <transition event="startGoingGreen" target="redGoingGreen"/> </state> <state id="yellow" initial="greenGoingRed"> <state id="redGoingGreen"> <onentry> <send event="goGreen" delay="1s"/> </onentry> <transition event="goGreen" target="green"/> </state> <state id="greenGoingRed"> <onentry> <send event="goRed" delay="1s"/> </onentry> <transition event="goRed" target="red"/> </state> </state> <state id="green"> <onentry> <send event="startGoingRed" delay="3s"/> </onentry> <transition event="startGoingRed" target="greenGoingRed"/> </state>
ステートへの接続は以下のように行う:
states: [ // Suppress qmllint warning, dynamic statemachine properties not known at compile-time // qmllint disable missing-property State { name: "Red" when: lights.stateMachine.red PropertyChanges { redLight.opacity: 1 } }, State { name: "RedGoingGreen" when: lights.stateMachine.redGoingGreen PropertyChanges { redLight.opacity: 1 } PropertyChanges { yellowLight.opacity: 1 } }, State { name: "Yellow" when: lights.stateMachine.yellow || lights.stateMachine.blinking PropertyChanges { yellowLight.opacity: 1 } }, State { name: "Green" when: lights.stateMachine.green PropertyChanges { greenLight.opacity: 1 } } // qmllint enable missing-property ]
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.