Spec-Zone.ru › Qt

Класс 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(&quot;media&quot;)).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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API