QScxmlCppDataModel Class
Die Klasse QScxmlCppDataModel ist ein C++ Datenmodell für einen Qt SCXML Zustandsautomaten. Mehr...
Kopfzeile: | #include <QScxmlCppDataModel> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Scxml) target_link_libraries(mytarget PRIVATE Qt6::Scxml) |
qmake: | QT += scxml |
Vererbt: | QScxmlDataModel |
Öffentliche Funktionen
QScxmlCppDataModel(QObject *parent = nullptr) | |
bool | inState(const QString &stateName) const |
const QScxmlEvent & | scxmlEvent() const |
Reimplementierte öffentliche Funktionen
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 |
Detaillierte Beschreibung
Das C++ Datenmodell für SCXML ermöglicht das Schreiben von C++ Code für expr Attribute und <script>
Elemente. Der Datenteil des Datenmodells wird durch eine Unterklasse von QScxmlCppDataModel unterstützt, für die der Qt SCXML Compiler (qscxmlc
) die Dispatch-Methoden erzeugt. Es kann nicht verwendet werden, wenn eine SCXML-Datei zur Laufzeit geladen wird.
Die Verwendung erfolgt über das Attribut datamodel des Elements <scxml>
:
<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" ....>
Das Format des Attributs datamodel lautet: cplusplus:<class-name>:<classdef-header>
. Für das obige Beispiel sollte also eine Datei thedatamodel.h vorhanden sein, die eine Unterklasse von QScxmlCppDataModel enthält, die mindestens Folgendes beinhaltet:
#include <QScxmlCppDataModel> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL ... };
Das Q_SCXML_DATAMODEL muss im privaten Abschnitt der Klassendefinition erscheinen, zum Beispiel direkt nach der öffnenden Klammer oder nach einem Q_OBJECT Makro. Dieses Makro erweitert die Deklaration einiger virtueller Methoden, deren Implementierung durch den Qt SCXML Compiler generiert wird.
Der Qt SCXML Compiler erzeugt die verschiedenen evaluateTo
Methoden und wandelt Ausdrücke und Skripte in Lambdas innerhalb dieser Methoden um. Ein Beispiel:
<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>
Dies führt zu:
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(); }(); // .... }
Sie sind also nicht auf den Aufruf von Funktionen beschränkt. In ein <script>
-Element können Sie null oder mehr C++-Anweisungen einfügen, und in den cond- oder expr-Attributen können Sie jeden C++-Ausdruck verwenden, der in das entsprechende bool oder QVariant konvertiert werden kann. Und da der this
-Zeiger ebenfalls erfasst wird, können Sie das Datenmodell aufrufen oder darauf zugreifen (das media-Attribut im obigen Beispiel). Das vollständige Beispiel finden Sie unter SCXML Media Player.
Siehe auch QScxmlStateMachine und QScxmlDataModel.
Dokumentation der Mitgliedsfunktionen
[explicit]
QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)
Erzeugt ein neues C++-Datenmodell mit dem übergeordneten Objekt parent.
[override virtual]
void QScxmlCppDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)
Reimplements: QScxmlDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok).
Diese Methode führt keine Aktion durch, ignoriert id und setzt ok auf false
. Überschreiben Sie sie in Ihrem spezifischen Datenmodell, um <assign>
zu implementieren.
[override virtual]
void QScxmlCppDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body)
Reimplements: QScxmlDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body).
Diese Methode führt keine Aktion durch, ignoriert id und body und setzt ok auf false
. Überschreiben Sie sie in Ihrem spezifischen Datenmodell, um <foreach>
zu implementieren.
[override virtual]
void QScxmlCppDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok)
Reimplements: QScxmlDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok).
Diese Methode führt keine Aktion durch, ignoriert id und setzt ok auf false
. Überschreiben Sie sie in Ihrem spezifischen Datenmodell, um <data>
zu implementieren.
[override virtual]
bool QScxmlCppDataModel::hasScxmlProperty(const QString &name) const
Reimplements: QScxmlDataModel::hasScxmlProperty(const QString &name) const.
Diese Methode gibt immer false
zurück und ignoriert name. Überschreiben Sie sie, um das Nachschlagen von Datenmodelleigenschaften über das location
Attribut verschiedener Elemente zu implementieren.
bool QScxmlCppDataModel::inState(const QString &stateName) const
Gibt true
zurück, wenn sich der Zustandsautomat in dem durch stateName angegebenen Zustand befindet, andernfalls false
.
const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const
Enthält das aktuelle Ereignis, das von der Zustandsmaschine verarbeitet wird.
Siehe auch SCXML-Spezifikation - 5.10 Systemvariablen für die Beschreibung der Variablen _event
.
Gibt das Ereignis zurück, das gerade verarbeitet wird.
Siehe auch setScxmlEvent().
[override virtual]
QVariant QScxmlCppDataModel::scxmlProperty(const QString &name) const
Reimplements: QScxmlDataModel::scxmlProperty(const QString &name) const.
Diese Methode gibt immer ein leeres QVariant zurück und ignoriert name. Überschreiben Sie sie, um das Nachschlagen von Datenmodelleigenschaften über das location
Attribut verschiedener Elemente zu implementieren.
Siehe auch setScxmlProperty().
[override virtual]
void QScxmlCppDataModel::setScxmlEvent(const QScxmlEvent &event)
Reimplements: QScxmlDataModel::setScxmlEvent(const QScxmlEvent &event).
Setzt die event, die als nächstes verarbeitet wird.
Siehe auch QScxmlCppDataModel::scxmlEvent.
[override virtual]
bool QScxmlCppDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context)
Reimplements: QScxmlDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context).
Diese Methode gibt immer false
zurück und ignoriert name, value, und context. Überschreiben Sie diese Methode, um das Nachschlagen von Datenmodelleigenschaften über das location
Attribut verschiedener Elemente zu implementieren.
Siehe auch scxmlProperty().
[override virtual invokable]
bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)
Reimplements: QScxmlDataModel::setup(const QVariantMap &initialDataValues).
Wird während der Initialisierung des Zustandsautomaten aufgerufen, um einen Zustandsautomaten mit den Anfangswerten für Datenmodellvariablen einzurichten, die durch ihre Schlüssel initialDataValues angegeben sind. Dies sind die Werte, die durch <param>
-Tags in einem <invoke>
-Element angegeben werden.
Gibt bei Erfolg true
zurück.
Hinweis: Diese Funktion kann über das Meta-Objektsystem und von QML aus aufgerufen werden. Siehe Q_INVOKABLE.
Siehe auch QScxmlStateMachine::init.
© 2025 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.