SCXML 调用

调用已编译的嵌套状态机。

调用演示如何使用生成的嵌套状态机的 <invoke> 元素,其中 SCXML 文件编译为 C++ 类。该 <invoke> 元素用于创建外部服务的实例。

运行示例

要从 Qt Creator 运行示例,请打开 欢迎 模式并从 示例 中选择示例。更多信息请访问 构建和运行示例

调用状态机

statemachine.scxml 中,我们指定一个名为 DirectionsStateMachine 且类型为 http://www.w3.org/TR/scxml/ 的状态机以调用

<scxml
    xmlns="http://www.w3.org/2005/07/scxml"
    version="1.0"
    name="DirectionsStateMachine"
    initial="anyplace"
>
    <state id="anyplace">
        <transition event="goNowhere" target="nowhere"/>
        <transition event="goSomewhere" target="somewhere"/>

        <state id="nowhere"/>
        <state id="somewhere">
            <invoke type="http://www.w3.org/TR/scxml/">
                <content>
                    <scxml name="anywhere" version="1.0">
                        <state id="here">
                            <transition event="goThere" target="there"/>
                        </state>
                        <state id="there">
                            <transition event="goHere" target="here"/>
                        </state>
                    </scxml>
                </content>
            </invoke>
        </state>
    </state>
</scxml>

编译状态机

我们通过向示例的构建文件中添加以下行链接到 Qt SCXML 模块。

invoke.pro 当使用 qmake 时:
QT += qml scxml

然后指定要编译的状态机

STATECHARTS = statemachine.scxml
CMakeLists.txt 当使用 cmake 时:
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml Scxml)

target_link_libraries(invoke PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Qml
    Qt6::Scxml
)

然后指定要编译的状态机

qt6_add_statecharts(invoke
    statemachine.scxml
)

使用 STATECHARTSqt6_add_statecharts 指令调用 Qt SCXML 编译器,即 qscxmlc,它会自动运行以生成 statemachine.hstatemachine.cpp,然后被适当地添加为编译的头部和源文件。

将状态机声明为 QML 元素

状态机声明为 QML 元素如下

struct DirectionsStateMachineRegistration
{
    Q_GADGET
    QML_FOREIGN(DirectionsStateMachine)
    QML_NAMED_ELEMENT(DirectionsStateMachine)
    QML_ADDED_IN_VERSION(1, 0)
};

实例化状态机

我们在 MainView.qml 文件中实例化生成的 DirectionsStateMachine 元素,如下所示

    DirectionsStateMachine {
        id: stateMachine
        running: true
    }

示例项目 @ code.qt.io

© 2024 Qt 公司有限公司。本文件中包含的文档贡献的版权属于各自的所有者。本文件提供的文档根据免费软件基金会发布的 GNU 自由文档许可 1.3 版 许可。Qt 及相关徽标是芬兰的 Qt 公司及/或其他国家和地区注册的商标。所有其他商标均为其各自所有者的财产。