Auf dieser Seite

QScxmlCppDataModel Class

Die Klasse „QScxmlCppDataModel“ ist ein C++-Datenmodell für eine „ Qt SCXML “-Zustandsmaschine. Mehr...

Header: #include <QScxmlCppDataModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)
qmake: QT += scxml
Erbt von: QScxmlDataModel

Öffentliche Funktionen

QScxmlCppDataModel(QObject *parent = nullptr)
bool inState(const QString &stateName) const
const QScxmlEvent &scxmlEvent() const

Neu implementierte ö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

Ausführliche Beschreibung

Das C++-Datenmodell für SCXML ermöglicht es Ihnen, C++-Code für „expr“-Attribute und „ <script> “-Elemente zu schreiben. Der Datenteil des Datenmodells basiert auf einer Unterklasse von „QScxmlCppDataModel“, für die der „ Qt SCXML “-Compiler (qscxmlc) die Dispatch-Methoden generiert. Es kann nicht verwendet werden, wenn eine SCXML-Datei zur Laufzeit geladen wird.

Die Verwendung erfolgt über das „datamodel “-Attribut des „ <scxml> “-Elements:

<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h"  ....>

Das Format des Attributs „datamodel“ lautet: „ cplusplus:<class-name>:<classdef-header> “. Für das obige Beispiel sollte es also eine Datei „thedatamodel.h“ geben, die eine Unterklasse von „QScxmlCppDataModel“ enthält, die mindestens Folgendes umfasst:

#include <QScxmlCppDataModel>

class TheDataModel: public QScxmlCppDataModel
{
    Q_OBJECT
    Q_SCXML_DATAMODEL
    ...
};

„Q_SCXML_DATAMODEL“ muss im privaten Abschnitt der Klassendefinition erscheinen, beispielsweise direkt nach der öffnenden Klammer oder nach einem „ Q_OBJECT “-Makro. Dieses Makro wird zur Deklaration einiger virtueller Methoden erweitert, deren Implementierung vom „ Qt SCXML “-Compiler generiert wird.

Der Qt SCXML -Compiler generiert die verschiedenen evaluateTo -Methoden und wandelt Ausdrücke und Skripte innerhalb dieser Methoden in Lambdas um. 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(&quot;media&quot;)).toString();
            </script>
            <send event="playbackStarted">
                <param name="media" expr="media"/>
            </send>
        </onentry>
    </state>
</scxml>

Dies führt zu folgendem Ergebnis:

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 darauf beschränkt, Funktionen aufzurufen. In ein „ <script> “-Element können Sie null oder mehr C++-Anweisungen einfügen, und in den Attributen „cond“ oder „expr“ können Sie beliebige C++-Ausdrücke verwenden, die in den jeweiligen Wert „bool“ oder „ QVariant “ konvertiert werden können. Da zudem der Zeiger „ this “ erfasst wird, können Sie das Datenmodell (im obigen Beispiel das „media “-Attribut) aufrufen oder darauf zugreifen. Das vollständige Beispiel finden Sie unter „SCXML Media Player“.

Siehe auch „ QScxmlStateMachine “ und „ QScxmlDataModel “.

Dokumentation zu Mitgliedsfunktionen

[explicit] QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)

Erstellt ein neues C++-Datenmodell mit dem übergeordneten Objekt „ parent “.

[override virtual] void QScxmlCppDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)

Umsetzt: QScxmlDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok).

Diese Methode führt keine Aktion aus, ignoriert ` id` und setzt ` ok ` auf ` false`. Überschreiben Sie diese Methode in Ihrem spezifischen Datenmodell, um ` <assign>` zu implementieren.

[override virtual] void QScxmlCppDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body)

Umsetzt: QScxmlDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body).

Diese Methode führt keine Aktion aus, 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)

Umsetzt: QScxmlDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok).

Diese Methode führt keine Aktion aus, ignoriert ` id` und setzt ` ok ` auf ` false`. Überschreiben Sie diese Methode in Ihrem spezifischen Datenmodell, um ` <data>` zu implementieren.

[override virtual] bool QScxmlCppDataModel::hasScxmlProperty(const QString &name) const

Implementiert: ` QScxmlDataModel::hasScxmlProperty(const QString &name) const`.

Diese Methode gibt immer ` false ` zurück und ignoriert ` name`. Überschreiben Sie diese Methode, um die Abfrage von Eigenschaften des Datenmodells über das Attribut ` location ` verschiedener Elemente zu implementieren.

bool QScxmlCppDataModel::inState(const QString &stateName) const

Gibt „ true “ zurück, wenn sich die Zustandsmaschine in dem durch „ stateName “ angegebenen Zustand befindet, andernfalls „ false “.

const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const

Enthält das aktuelle Ereignis, das gerade von der Zustandsmaschine verarbeitet wird.

Siehe auch SCXML-Spezifikation – 5.10 Systemvariablen für die Beschreibung der Variablen „ _event “.

Gibt das derzeit verarbeitete Ereignis zurück.

Siehe auch „ setScxmlEvent()“.

[override virtual] QVariant QScxmlCppDataModel::scxmlProperty(const QString &name) const

Implementiert: ` QScxmlDataModel::scxmlProperty(const QString &name) const`.

Diese Methode gibt immer ein leeres ` QVariant ` zurück und ignoriert ` name`. Überschreiben Sie sie, um die Abfrage von Eigenschaften des Datenmodells über das Attribut ` location ` verschiedener Elemente zu implementieren.

Siehe auch „ setScxmlProperty()“.

[override virtual] void QScxmlCppDataModel::setScxmlEvent(const QScxmlEvent &event)

Implementiert: ` QScxmlDataModel::setScxmlEvent(const QScxmlEvent &event)`.

Legt das event fest, das als Nächstes verarbeitet wird.

Siehe auch „ QScxmlCppDataModel::scxmlEvent “.

[override virtual] bool QScxmlCppDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context)

Implementiert: 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 sie, um die Suche nach Eigenschaften des Datenmodells über das Attribut ` location ` verschiedener Elemente zu implementieren.

Siehe auch ` scxmlProperty()`.

[override virtual invokable] bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)

Umsetzt: ` QScxmlDataModel::setup(const QVariantMap &initialDataValues)`.

Wird während der Initialisierung der Zustandsmaschine aufgerufen, um eine Zustandsmaschine unter Verwendung der Anfangswerte für die Variablen des Datenmodells einzurichten, die durch ihre Schlüssel initialDataValues angegeben sind. Dabei handelt es sich um die Werte, die durch die Tags „ <param> “ in einem „ <invoke> “-Element angegeben sind.

Gibt bei Erfolg ` true ` zurück.

Hinweis: Diese Funktion kann über das Metaobjektsystem und aus QML aufgerufen werden. Siehe Q_INVOKABLE.

Siehe auch „ 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.