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