Qt
QML

SignalTransitionサンプル

SignalTransitionのサンプルコード

テスト用QML

import QtQuick 2.9
import QtQuick.Window 2.3
import QtQuick.Controls 2.2
import QtQml.StateMachine 1.0 as DSM
import QtMultimedia 5.9

Window {
    id: window
    visible: true
    width: 640
    height: 480

    // StateMachine作成
    DSM.StateMachine {
        id: stateMachine
        initialState: textState
        running: true

        // 初期状態
        DSM.State {
            id: textState

            // buttonクリック時にfinalState状態へ切り替え
            // ただし、checkBoxGuardがチェックされている場合は状態の変更を行わない
            DSM.SignalTransition {
                targetState: finalState
                signal: button.clicked
                guard: !checkBoxGuard.checked
            }
        }

        // 最終状態
        DSM.FinalState {
            id: finalState
        }

        // 最終状態になった時のハンドラ
        onFinished: {
            text1.text = "Finished!"
            color = "#ff0000"
        }
    }

    Row {
        id: row
        spacing: 2

        // 状態変更ボタン
        Button {
            id: button
            anchors.verticalCenter: parent.verticalCenter
            text: "Click Me!"
            onClicked: {
                if (checkBoxGuard.checked == false) {
                    enabled = false
                    checkBoxGuard.enabled = false
                    okSound.play()
                } else {
                    ngSound.play()
                    text1.text = "Guard!"
                }
            }
            Audio { id: okSound; source: "Sounds/btn01.mp3" }
            Audio { id: ngSound; source: "Sounds/btn02.mp3" }
        }

        // ガード有効チェックボックス
        CheckBox {
            id: checkBoxGuard
            checkable: true
            text: qsTr("Guard")
            onClicked: checkSound.play()
            Audio { id: checkSound; source: "Sounds/btn03.mp3" }
        }
    }

    // 状態表示テキスト
    Text {
        id: text1
        text: qsTr("Inital State")
        anchors.top: row.bottom
        anchors.left: parent.left
    }
}

実行結果

SignalTransitionサンプル動画
https://youtu.be/JoLe2rc9En4
※Linux Mint 18.2 & Qt 5.9.1使用