Создание пользовательской модели данных для Qt SCXML

Я использую Qt с конечным автоматом SCXML. Я хочу использовать встроенный интерпретатор Qt SCXML через QScxmlStateMachine, Однако Qt поддерживает только модели данных Null, EcmaScript и C++ для SCXML. У моего конечного автомата есть пользовательская модель данных.

Я хотел бы подкласс QScxmlDataModel поддержать мой конечный автомат. Я могу видеть, как реализация setup(), hasScxmlProperty(), setScxmlProperty(), а также scxmlProperty() функции позволят устанавливать / получать значения из модели данных.

Тем не менее, я не вижу, как сделать так, чтобы выражения и другие специфичные для модели элементы, такие как с <transition cond="..."> или же <script>...</script> - будет правильно оцениваться в моей пользовательской модели данных.

Как я могу создать собственную модель данных, которая знает, как сделать больше, чем просто получить / установить свойства?

1 ответ

Решение

Вам нужно будет переопределить различные функции оценки QScxmlDataModel:

virtual QString evaluateToString(QScxmlExecutableContent::EvaluatorId id, bool *ok) = 0;
virtual bool evaluateToBool(QScxmlExecutableContent::EvaluatorId id, bool *ok) = 0;
virtual QVariant evaluateToVariant(QScxmlExecutableContent::EvaluatorId id, bool *ok) = 0;
virtual void evaluateToVoid(QScxmlExecutableContent::EvaluatorId id, bool *ok) = 0;
virtual void evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok) = 0;
virtual void evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok) = 0;
virtual bool evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, ForeachLoopBody *body) = 0;

Все они были исключены из документации, но вы можете увидеть их здесь.

Я предполагаю, что причина этого в том, что модуль Qt SCXML выпущен в качестве предварительного просмотра технологии, и API может измениться в будущем.

Другие вопросы по тегам