- class QScxmlCppDataModel#
QScxmlCppDataModel
类是Qt SCXML状态机的C++数据模型。更多...摘要#
方法#
def
__init__()
def
inState()
def
scxmlEvent()
注意
此文档可能包含自动从 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("media")).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++ 语句,在 cond 或 expr 属性中,您可以使用任何可以转换为相应 bool 或 QVariant 的 C++ 表达式。此外,由于this
指针也被捕获,您可以调用或访问数据模型(例如,上面的示例中的 media 属性)。有关完整示例,请参阅 SCXML 媒体播放器。创建一个新的C++数据模型,父对象为
parent
。- inState(stateName)#
- 参数:
stateName – str
- 返回类型:
bool
如果状态机处于由
stateName
指定的状态则返回true
,否则返回false
。- scxmlEvent()#
- 返回类型:
包含状态机正在处理的当前事件。
有关关于
_event
变量的描述,请参阅SCXML 规范 - 5.10 系统变量。返回当前正在处理的事件。
另请参阅
setScxmlEvent()