Класс 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>. Часть data модели данных поддерживается подклассом 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 должен появиться в частной секции определения класса, например, сразу после открывающей скобки или после макроса 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.1/qscxmlcppdatamodel.html