Класс QScxmlCppDataModel
Класс QScxmlCppDataModel — это модель данных C++ для состояния Qt SCXML-машины. Подробнее...
| Заголовок: | #include <QScxmlCppDataModel> |
| CMake: | find_package(Qt6 COMPONENTS Scxml REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Scxml) |
| qmake: | QT += scxml |
| С момента: | Qt 5.7 |
| Наследует: | QScxmlDataModel |
Открытые функции
| QScxmlCppDataModel(QObject *parent = nullptr) | |
| bool | inState(const QString &stateName) const |
| const QScxmlEvent & | scxmlEvent() const |
Переопределённые открытые функции
| virtual void | evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok) override |
| virtual void | evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body) override |
| virtual void | evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok) override |
| virtual bool | hasScxmlProperty(const QString &name) const override |
| virtual QVariant | scxmlProperty(const QString &name) const override |
| virtual void | setScxmlEvent(const QScxmlEvent &event) override |
| virtual bool | setScxmlProperty(const QString &name, const QVariant &value, const QString &context) override |
| virtual bool | setup(const QVariantMap &initialDataValues) override |
Подробное описание
Модель данных C++ для SCXML позволяет вам написать код C++ для атрибутов expr и элементов <script>. Часть данных модели данных поддерживается подклассом QScxmlCppDataModel, для которого компилятор Qt SCXML (qscxmlc) сгенерирует методы обработки. Его нельзя использовать при загрузке файла SCXML во время выполнения.
Использование осуществляется через атрибут datamodel элемента <scxml>:
<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" ....>
Формат атрибута datamodel: cplusplus:<class-name>:<classdef-header>. Таким образом, для приведенного выше примера должен быть файл thedatamodel.h, содержащий подкласс QScxmlCppDataModel, содержащий, по крайней мере, следующее:
#include "qscxmlcppdatamodel.h"
class TheDataModel: public QScxmlCppDataModel
{
\Q_OBJECT
Q_SCXML_DATAMODEL
}; Q_SCXML_DATAMODEL должен появляться в разделе private определения класса, например, сразу после открывающей скобки или после макроса Q_OBJECT. Этот макрос расширяется до объявления некоторых виртуальных методов, реализация которых генерируется компилятором Qt SCXML.
Компилятор Qt SCXML сгенерирует различные evaluateTo методы и преобразует выражения и скрипты в лямбда-функции внутри этих методов. Например:
<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="MediaPlayerStateMachine">
<state id="stopped">
<transition event="tap" cond="isValidMedia()" target="playing"/>
</state>
<state id="playing">
<onentry>
<script>
media = eventData().value(QStringLiteral("media")).toString();
</script>
<send event="playbackStarted">
<param name="media" expr="media"/>
</send>
</onentry>
</state>
</scxml> Это приведет к:
bool TheDataModel::evaluateToBool(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
// ....
return [this]()->bool{ return isValidMedia(); }();
// ....
}
QVariant TheDataModel::evaluateToVariant(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
// ....
return [this]()->QVariant{ return media; }();
// ....
}
void TheDataModel::evaluateToVoid(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
// ....
[this]()->void{ media = eventData().value(QStringLiteral("media")).toString(); }();
// ....
} Таким образом, вы не ограничены вызовом функций. В элементе <script> можно разместить ноль или более операторов C++, а в атрибутах cond или expr можно использовать любые выражения C++, которые можно преобразовать в соответствующие bool или QVariant. И, поскольку указатель this также захвачен, вы можете вызвать или получить доступ к модели данных (атрибут media в приведенном выше примере). Полный пример см. в Qt SCXML: Пример медиаплеера QML (Модель данных C++).
См. также QScxmlStateMachine и QScxmlDataModel.
Документация по членам-функциям
QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)
Создаёт новую модель данных C++ с родительским объектом parent.
[override virtual] void QScxmlCppDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)
Переопределяет: QScxmlDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok).
Этот метод не выполняет никаких действий, игнорирует id и устанавливает ok в false. Переопределите его в вашей конкретной модели данных, чтобы реализовать <assign>.
[override virtual] void QScxmlCppDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body)
Переопределяет: QScxmlDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body).
Этот метод не выполняет никаких действий, игнорирует id и body, и устанавливает ok в false. Переопределите его в вашей конкретной модели данных, чтобы реализовать <foreach>.
[override virtual] void QScxmlCppDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok)
Переопределяет: QScxmlDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok).
Этот метод не выполняет никаких действий, игнорирует id и устанавливает ok в false. Переопределите его в вашей конкретной модели данных, чтобы реализовать <data>.
[override virtual] bool QScxmlCppDataModel::hasScxmlProperty(const QString &name) const
Переопределяет: QScxmlDataModel::hasScxmlProperty(const QString &name) const.
Этот метод всегда возвращает false и игнорирует name. Переопределите его, чтобы реализовать поиск свойств модели данных через атрибут location различных элементов.
bool QScxmlCppDataModel::inState(const QString &stateName) const
Возвращает true, если машина состояний находится в состоянии, указанном stateName, false в противном случае.
const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const
Содержит текущее событие, обрабатываемое машиной состояний.
См. Спецификацию SCXML - 5.10 Переменные системы для описания переменной _event.
Возвращает обрабатываемое в данный момент событие.
См. также setScxmlEvent().
[override virtual] QVariant QScxmlCppDataModel::scxmlProperty(const QString &name) const
Переопределяет: QScxmlDataModel::scxmlProperty(const QString &name) const.
Этот метод всегда возвращает пустой QVariant и игнорирует name. Переопределите его, чтобы реализовать поиск свойств модели данных через атрибут location различных элементов.
См. также setScxmlProperty().
[override virtual] void QScxmlCppDataModel::setScxmlEvent(const QScxmlEvent &event)
Переопределяет: QScxmlDataModel::setScxmlEvent(const QScxmlEvent &event).
Устанавливает event, который будет обработан следующим.
См. также QScxmlCppDataModel::scxmlEvent.
[override virtual] bool QScxmlCppDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context)
Переопределяет: QScxmlDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context).
Этот метод всегда возвращает false и игнорирует name, value и context. Переопределите его для реализации поиска свойств модели данных через атрибут location различных элементов.
См. также scxmlProperty().
[override virtual invokable] bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)
Переопределяет: QScxmlDataModel::setup(const QVariantMap &initialDataValues).
Вызывается во время инициализации машины состояний для настройки машины состояний с использованием начальных значений переменных модели данных, указанных их ключами, initialDataValues. Это значения, указанные тегами <param> в элементе <invoke>.
Возвращает true при успехе.
Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.
См. также QScxmlStateMachine::init.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qscxmlcppdatamodel.html