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("media")).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.