如何在scxml ecmascript数据模型中注册C ++函数?

时间:2018-07-10 15:43:33

标签: javascript c++ qt qt5 scxml

不建议使用此问题

此后,我将状态机转换为使用额外的状态来在enter上调用C ++函数,并在该函数返回值时触发sendEvent

旧问题如下:

我有一个用Qt设计的简单SCXML模型。它缺少某些功能,例如侦听发布/订阅队列,为此,我想将某些功能注册到QScxmlStateMachine实例中,以便可以从状态机的ECMAScript部分调用它们。我看过QScxmlEcmaScriptDataModel,但不了解如何修改评估函数以注册回调。是否可以将C ++函数和回调注册到Qt scxml状态机?如果可以,怎么办?

其他信息:

我创建了一个名为RegisterJs的类,它是registerjs.h

#ifndef REGISTERJS_H
#define REGISTERJS_H

#include <QObject>
#include <QString>
#include <QQmlEngine>

class RegisterJS : public QObject
{
    Q_OBJECT
public:
    explicit RegisterJS(QObject *parent = nullptr);
    Q_INVOKABLE void showMessage(QString message);
signals:

public slots:
};

static QObject *registerJSProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    RegisterJS *singletonClass = new RegisterJS();
    return singletonClass;
}

#endif // REGISTERJS_H

这是registerjs.cpp

#include "registerjs.h"
#include <QMessageBox>

RegisterJS::RegisterJS(QObject *parent) : QObject(parent)
{

}

void RegisterJS::showMessage(QString message){
    QMessageBox::information(0, message, message);
}

这是我注册课程的方式:

qmlRegisterSingletonType<RegisterJS>("in.nurett", 1, 0, "RegisterJS", registerJSProvider);

这是testflow.js的内容:

function testShowMessage() { RegisterJS.showMessage("test"); }

这是来自testflow.scxml的相关内容:

<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" binding="early" xmlns:qt="http://www.qt.io/2015/02/scxml-ext" name="teststate" qt:editorversion="4.6.2" initial="initialize">
    <state id="initialize">
        <onentry>
            <script>testShowMessage();</script>
        </onentry>
    </state>
    <script src=":testflow.js"/>

但是没有显示信息消息。

0 个答案:

没有答案