Spec-Zone.ru › Qt 6.1

Класс 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(&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.1/qscxmlcppdatamodel.html

Spec-Zone.ru

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