Qt Qmlステータスマシンフレームワーク
4348 ワード
Qt5.4 QMLステートマシンフレームワークを導入し、C++ステートマシンフレームワークと同様に、アプリケーションでステータスマップを作成して実行できます.そのため、QtQml.StateMachineモジュールには、イベント駆動のステートマシンを作成するための関連QMLタイプがいくつか用意されています.これらのQMLタイプは以下のように列挙されています.
StateMachine--ステータスマシンの執事、実行アルゴリズムはSCXML(State Chart XML)に基づいて、ステータスマシンが起動する前に初期状態、すなわちinitialState属性を設定します.
State-ステートマシンにおける汎用タイプは、QtQuickモジュールにおけるStateタイプとは異なることに注意する、モジュールを導入する際にQtQuickモジュールを先に導入し、その後QtQmlを導入する.StateMachineモジュール.
FinalState--文字通り、ステートマシンの動作終了時にこの状態を使用すると、このステートマシンのfinished()信号がトリガーされます.
HistoryState--最後に親状態を終了したときの子状態を記録した擬似状態で、最初はデフォルト状態を指定できます.
SignalTransition--特定の信号に基づいて状態を切り替えます.
TimeoutTransition-タイマーに従ってステータスを切り替えます.
以下に、総合的な例を示します.
また、StateのchildMode属性はデフォルトでは単一状態モードであり、最初に初期状態を設定するには、childModeをパラレルモードに設定することもでき、親状態に入ると同時にすべてのサブ状態に入ることができます.
詳細については、以下のQt公式サイトのドキュメントを参照してください.
http://doc.qt.io/qt-5/qmlstatemachine.html
StateMachine--ステータスマシンの執事、実行アルゴリズムはSCXML(State Chart XML)に基づいて、ステータスマシンが起動する前に初期状態、すなわちinitialState属性を設定します.
State-ステートマシンにおける汎用タイプは、QtQuickモジュールにおけるStateタイプとは異なることに注意する、モジュールを導入する際にQtQuickモジュールを先に導入し、その後QtQmlを導入する.StateMachineモジュール.
FinalState--文字通り、ステートマシンの動作終了時にこの状態を使用すると、このステートマシンのfinished()信号がトリガーされます.
HistoryState--最後に親状態を終了したときの子状態を記録した擬似状態で、最初はデフォルト状態を指定できます.
SignalTransition--特定の信号に基づいて状態を切り替えます.
TimeoutTransition-タイマーに従ってステータスを切り替えます.
以下に、総合的な例を示します.
// Qt5.4
// QtQuick , QtQml.StateMachine
import QtQuick 2.4
import QtQuick.Controls 1.2
import QtQml.StateMachine 1.0
Item {
width: 400
height: 200
Row {
anchors.centerIn: parent
spacing: 10
Button {
id: startButton
text: "start"
onClicked: {
//
if (!stateMachine.running) {
stateMachine.running = true
}
}
}
Button {
id: button
//
text: s11.active ? "s11" : s12.active ? "s12" : s13.active ? "s13" : "state"
}
Button {
id: historyButton
//
text: stateMachine.running ? s1.active ? "interrupt" : "resume" : "history"
}
Button {
id: quitButton
text: "quit"
}
}
StateMachine {
id: stateMachine
initialState: s1 //
// running: true // running button(startButton)
State {
id: s1
initialState: s11 //
SignalTransition {
targetState: s3 // signal state
signal: historyButton.clicked
}
SignalTransition {
targetState: s2 // signal state
signal: quitButton.clicked
}
onEntered: console.log("s1 entered")
onExited: console.log("s1 exited")
State {
id: s11
SignalTransition {
targetState: s12 // signal state
signal: button.clicked
}
onEntered: console.log("s11 entered")
onExited: console.log("s11 exited")
}
State {
id: s12
SignalTransition { // signal state
targetState: s13
signal: button.clicked
}
SignalTransition { // override state signal(quitButton.clicked)
signal: quitButton.clicked
onTriggered: console.log("override - quitButton clicked")
}
onEntered: console.log("s12 entered")
onExited: console.log("s12 exited")
}
State {
id: s13
SignalTransition { // signal state
targetState: s11
signal: button.clicked
}
TimeoutTransition { // state
targetState: s2
timeout: 2000
}
onEntered: console.log("s13 entered")
onExited: console.log("s13 exited")
}
HistoryState { //
id: history
}
}
State {
id: s3
SignalTransition { // signal state
targetState: history
signal: historyButton.clicked
}
onEntered: console.log("s3 entered")
onExited: console.log("s3 exited")
}
FinalState {
id: s2
}
onFinished: console.log("state finished")
}
}
また、StateのchildMode属性はデフォルトでは単一状態モードであり、最初に初期状態を設定するには、childModeをパラレルモードに設定することもでき、親状態に入ると同時にすべてのサブ状態に入ることができます.
詳細については、以下のQt公式サイトのドキュメントを参照してください.
http://doc.qt.io/qt-5/qmlstatemachine.html