QtScxml状态机中的事件处理

时间:2018-12-17 16:27:30

标签: c++ qt qt5 scxml

我正在尝试使用QScxmlStateMachine对象,但是不幸的是,无论cond的{​​{1}}属性是否已填充,无论值如何,我都无法触发事件

machine.scxml:

transition

main.cpp:

<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" binding="early" name="Machine" qt:editorversion="4.8.0" xmlns:qt="http://www.qt.io/2015/02/scxml-ext">
    <state id="state1">
        <qt:editorinfo scenegeometry="351.24;371.78;291.24;321.78;120;100" geometry="351.24;371.78;-60;-50;120;100"/>
        <transition type="external" event="event1" target="state2" cond="_event.data.dt === 'blah'"/>
    </state>
    <state id="state2">
        <qt:editorinfo scenegeometry="614.16;371.78;554.16;321.78;120;100" geometry="614.16;371.78;-60;-50;120;100"/>
    </state>
</scxml>

test_scxml.pro:

#include <QApplication>

#include "machine.h"

using namespace std;

void displayActiveStates(Machine &machine);
void connectToState(Machine &machine, const QString &state);

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Machine machine;
    machine.start();

    connectToState(machine, "state1");
    connectToState(machine, "state2");

    machine.submitEvent("event1", QVariantMap({
        {"dt", "blah"}
    }));

    return a.exec();
}

void displayActiveStates(Machine &machine) {
    for (auto state : machine.activeStateNames()) {
        qDebug(state.toLatin1());
    }
}

void connectToState(Machine &machine, const QString &state) {
    machine.connectToState(state, &machine, [&machine](bool active) {
        displayActiveStates(machine);
        qDebug(active ? "active" : "inactive");
    });
}

删除此属性后,一切正常。

有什么主意吗?

1 个答案:

答案 0 :(得分:1)

如果对docs进行了审核:

  

数据模型

     

Qt SCXML支持null数据模型,必须由null支持。   兼容的SCXML处理器和ECMAScript数据模型。在   此外,Qt SCXML提供了自己的C ++数据模型,该模型已实现   通过QScxmlCppDataModel类。该类可以编写C ++代码   用于expr属性和元素。数据的数据部分   模型由QScxmlCppDataModel的子类支持,为此Qt   SCXML编译器将生成调度方法。

您需要添加datamodel="ecmascript"属性:

<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" binding="early" name="Machine" qt:editorversion="4.8.0" xmlns:qt="http://www.qt.io/2015/02/scxml-ext" datamodel="ecmascript">
    <state id="state1">
        <qt:editorinfo scenegeometry="351.24;371.78;291.24;321.78;120;100" geometry="351.24;371.78;-60;-50;120;100"/>
        <transition type="external" event="event1" target="state2" cond="_event.data.dt === 'blah'"/>
    </state>
    <state id="state2">
        <qt:editorinfo scenegeometry="614.16;371.78;554.16;321.78;120;100" geometry="614.16;371.78;-60;-50;120;100"/>
    </state>
</scxml>