0

这个问题已弃用

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

老问题如下:

我有一个用 Qt 设计的简单 SCXML 模型。它缺少一些功能,例如监听 pub/sub 队列,为此我想将一些函数注册到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"/>

但是没有显示信息消息。

4

0 回答 0