这个问题已弃用
此后,我将状态机转换为使用额外的状态来调用 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"/>
但是没有显示信息消息。