QScxmlCppDataModel Class
La clase QScxmlCppDataModel es un modelo de datos C++ para una máquina de estados Qt SCXML. Más...
| Cabecera: | #include <QScxmlCppDataModel> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Scxml)target_link_libraries(mytarget PRIVATE Qt6::Scxml) |
| qmake: | QT += scxml |
| Hereda: | QScxmlDataModel |
Funciones Públicas
| QScxmlCppDataModel(QObject *parent = nullptr) | |
| bool | inState(const QString &stateName) const |
| const QScxmlEvent & | scxmlEvent() const |
Funciones públicas reimplementadas
| 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 |
Descripción detallada
El modelo de datos C++ para SCXML permite escribir código C++ para atributos expr y elementos <script>. La parte de datos del modelo de datos está respaldada por una subclase de QScxmlCppDataModel, para la que el compilador Qt SCXML (qscxmlc) generará los métodos de envío. No se puede utilizar al cargar un archivo SCXML en tiempo de ejecución.
Se utiliza a través del atributo datamodel del elemento <scxml>:
<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" ....>
El formato del atributo datamodel es: cplusplus:<class-name>:<classdef-header>. Por lo tanto, para el ejemplo anterior, debe haber un archivo thedatamodel.h que contenga una subclase de QScxmlCppDataModel, que contenga al menos lo siguiente:
#include <QScxmlCppDataModel> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL ... };
Q_SCXML_DATAMODEL tiene que aparecer en la sección privada de la definición de la clase, por ejemplo justo después del paréntesis de apertura, o después de una macro Q_OBJECT. Esta macro se expande a la declaración de algunos métodos virtuales cuya implementación es generada por el compilador Qt SCXML.
El compilador Qt SCXML generará los distintos métodos evaluateTo, y convertirá las expresiones y scripts en lambdas dentro de esos métodos. Por ejemplo:
<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>
Esto dará como resultado:
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(); }(); // .... }
Por lo tanto, no estás limitado a llamar a funciones. En un elemento <script> puede poner cero o más sentencias C++, y en los atributos cond o expr puede utilizar cualquier expresión C++ que pueda convertirse al bool o QVariant respectivo. Y, como también se captura el puntero this, puede llamar o acceder al modelo de datos (el atributo media en el ejemplo anterior). Para ver el ejemplo completo, consulte SCXML Media Player.
Véase también QScxmlStateMachine y QScxmlDataModel.
Documentación de funciones miembro
[explicit] QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)
Crea un nuevo modelo de datos C++ con el objeto padre parent.
[override virtual] void QScxmlCppDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)
Reimplementa: QScxmlDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok).
Este método no realiza ninguna acción, ignora id, y establece ok en false. Anúlelo en su modelo de datos específico para implementar <assign>.
[override virtual] void QScxmlCppDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body)
Reimplementa: QScxmlDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body).
Este método no realiza ninguna acción, ignora id y body, y establece ok en false. Anúlelo en su modelo de datos específico para implementar <foreach>.
[override virtual] void QScxmlCppDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok)
Reimplementa: QScxmlDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok).
Este método no realiza ninguna acción, ignora id, y establece ok en false. Anúlelo en su modelo de datos específico para implementar <data>.
[override virtual] bool QScxmlCppDataModel::hasScxmlProperty(const QString &name) const
Reimplementa: QScxmlDataModel::hasScxmlProperty(const QString &name) const.
Este método siempre devuelve false e ignora name. Reemplázalo para implementar la búsqueda de propiedades del modelo de datos a través del atributo location de varios elementos.
bool QScxmlCppDataModel::inState(const QString &stateName) const
Devuelve true si la máquina de estados está en el estado especificado por stateName, false en caso contrario.
const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const
Contiene el evento actual que está siendo procesado por la máquina de estado.
Véase también Especificación SCXML - 5.10 Variables del sistema para la descripción de la variable _event.
Devuelve el evento que se está procesando actualmente.
Véase también setScxmlEvent().
[override virtual] QVariant QScxmlCppDataModel::scxmlProperty(const QString &name) const
Reimplementa: QScxmlDataModel::scxmlProperty(const QString &name) const.
Este método devuelve siempre un QVariant vacío e ignora name. Anúlelo para implementar la búsqueda de propiedades del modelo de datos a través del atributo location de varios elementos.
Véase también setScxmlProperty().
[override virtual] void QScxmlCppDataModel::setScxmlEvent(const QScxmlEvent &event)
Reimplementa: QScxmlDataModel::setScxmlEvent(const QScxmlEvent &event).
Establece el event que será procesado a continuación.
Véase también QScxmlCppDataModel::scxmlEvent.
[override virtual] bool QScxmlCppDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context)
Reimplementa: QScxmlDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context).
Este método siempre devuelve false e ignora name, value, y context. Anúlelo para implementar la búsqueda de propiedades del modelo de datos a través del atributo location de varios elementos.
Véase también scxmlProperty().
[override virtual invokable] bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)
Reimplementa: QScxmlDataModel::setup(const QVariantMap &initialDataValues).
Llamada durante la inicialización de la máquina de estados para configurar una máquina de estados utilizando los valores iniciales para las variables del modelo de datos especificadas por sus claves, initialDataValues. Estos son los valores especificados por las etiquetas <param> en un elemento <invoke>.
Devuelve true en caso de éxito.
Nota: Esta función puede invocarse a través del sistema de metaobjetos y desde QML. Véase Q_INVOKABLE.
Véase también QScxmlStateMachine::init.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.