dataModel
状态机的数据模型,决定状态机可以配置什么样的数据,可以使用哪些与数据有关的表达式和元素。
数据模型提供了状态机存储、读取和修改内部数据集的能力。特定的数据模型定义了一组表达式,表达式用于引用到数据模型的位置、计算值或给数据模型赋值,也可产生布尔条件。另外,数据集也包含了一组系统变量,这些系统变量由处理器自动持有。
<datamodel>
<data id="mydata"/>
</datamodel>
标准附录描述了二种数据模型:
-
空数据模型
-
脚本数据模型
Qt定义了 一种数据模型:
- c++数据模型
空数据模型
空数据模型只支持in(id)
条件判断,确定是否处理某种状态,其他操作都是无效的,包括系统变量也是无法访问的.
脚本数据模型
ecmascript数据模型是在状态里按ecmascript的方式定义数据元素,并使用ecmascript脚本实现scritp\cond\expr等功能.
c++数据模型
这种数据模型是直接使用自定义的一个c++类,并在状态机初始化时使用外部的对象。在状态机中脚本或表达式里就可以直接写c++代码来直接访问c++对象。c++数据模型只能使用预编译的模式,不能动态加载,这里因为只有对scxml文件预编译才能把scxml文件中的c++代码转换为实际源文件中的生成c++代码。
看一下mediaplayer-qml-cppdatamodel示例。
c++模型声明
在状态机中声明c++数据类型,指定类名和声明文件
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" binding="early" name="MediaPlayerStateMachine" datamodel="cplusplus:TheDataModel:thedatamodel.h" qt:editorversion="4.8.2" xmlns:qt="http://www.qt.io/2015/02/scxml-ext" initial="stopped">
其中datamodel="cplusplus:TheDataModel:thedatamodel.h"
是数据类型的定义部分。
首先必须自定义一个类,这个类从QScxmlCppDataModel
继承,并加上Q_OBJECT和一个特殊的宏Q_SCXML_DATAMODEL
,并实现自己的其他自定义部分。
自定义c++模型类
文件thedatamodel.h
:
#ifndef THEDATAMODEL_H
#define THEDATAMODEL_H
#include "qscxmlcppdatamodel.h"
class TheDataModel: public QScxmlCppDataModel
{
Q_OBJECT
Q_SCXML_DATAMODEL
private:
bool isValidMedia() const;
QVariantMap eventData() const;
QString media;
};
#endif // THEDATAMODEL_H</