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 ]
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。