class QScxmlCppDataModel#

QScxmlCppDataModel类是Qt SCXML状态机的C++数据模型。更多...

Inheritance diagram of PySide6.QtScxml.QScxmlCppDataModel

摘要#

方法#

注意

此文档可能包含自动从 C++ 翻译到 Python 的代码片段。我们始终欢迎为代码片段翻译做出贡献。如果发现翻译问题,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 上创建工单来告知我们。

详细信息#

SCXML 的 C++ 数据模型允许您为 expr 属性和 <script> 元素编写 C++ 代码。数据模型的 数据部分QScxmlCppDataModel 的子类支持,Qt SCXML 编译器(qscxmlc)将为它生成调度方法。在运行时加载 SCXML 文件时不能使用。

使用方法是 <scxml> 元素的 datamodel 属性。

<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h"  ....>

datamodel 属性的格式为: cplusplus:<class-name>:<classdef-header>。因此,对于上面的示例,应该有一个名为 thedatamodel.h 的文件,其中包含 QScxmlCppDataModel 的子类,包含以下内容至少:

#include "qscxmlcppdatamodel.h"

class TheDataModel: public QScxmlCppDataModel
{
    \Q_OBJECT
    Q_SCXML_DATAMODEL
};

Q_SCXML_DATAMODEL 必须出现在类定义的私有部分中,例如在开括号后或 Q_OBJECT 宏之后。此宏展开为一些虚拟方法的声明,其实现在 Qt SCXML 编译器生成。

Qt SCXML 编译器将生成各种 evaluateTo 方法,并将表达式和脚本转换为这些方法中的 lambda。例如:

<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="MediaPlayerStateMachine">
    <state id="stopped">
        <transition event="tap" cond="isValidMedia()" target="playing"/>
    </state>

    <state id="playing">
        <onentry>
            <script>
                media = eventData().value(QStringLiteral(&quot;media&quot;)).toString();
            </script>
            <send event="playbackStarted">
                <param name="media" expr="media"/>
            </send>
        </onentry>
    </state>
</scxml>

这将导致:

bool TheDataModel::evaluateToBool(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
    // ....
        return [this]()->bool{ return isValidMedia(); }();
    // ....
}

QVariant TheDataModel::evaluateToVariant(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
    // ....
        return [this]()->QVariant{ return media; }();
    // ....
}

void TheDataModel::evaluateToVoid(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
    // ....
        [this]()->void{ media = eventData().value(QStringLiteral("media")).toString(); }();
    // ....
}

因此,您不仅限于调用函数。在 <script> 元素中,您可以放置零个或多个 C++ 语句,在 condexpr 属性中,您可以使用任何可以转换为相应 bool 或 QVariant 的 C++ 表达式。此外,由于 this 指针也被捕获,您可以调用或访问数据模型(例如,上面的示例中的 media 属性)。有关完整示例,请参阅 SCXML 媒体播放器

__init__([parent=None])#
参数:

parentQObject

创建一个新的C++数据模型,父对象为parent

inState(stateName)#
参数:

stateName – str

返回类型:

bool

如果状态机处于由stateName指定的状态则返回true,否则返回false

scxmlEvent()#
返回类型:

QScxmlEvent

包含状态机正在处理的当前事件。

有关关于_event变量的描述,请参阅SCXML 规范 - 5.10 系统变量

返回当前正在处理的事件。

另请参阅

setScxmlEvent()