Этот вопрос не рекомендуется
С тех пор я преобразовал свои конечные автоматы, чтобы использовать дополнительное состояние для вызова функции C ++ при вводе, и я запускаю sendEvent
когда функция возвращает значение.
Старый вопрос заключается в следующем:
У меня есть простая модель SCXML, разработанная в Qt. Не хватает некоторых функций, таких как прослушивание очередей 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"/>
Но информационное сообщение не появляется.
Задача ещё не решена.
Других решений пока нет …