QScxmlStateMachine 类
QScxmlStateMachine 类提供了从 SCXML 文件创建的状态机的接口。 更多...
头文件 | #include <QScxmlStateMachine> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Scxml) target_link_libraries(mytarget PRIVATE Qt6::Scxml) |
qmake | QT += scxml |
实例化 | ScxmlStateMachine |
继承 | QObject |
属性
|
|
公共函数
QStringList | activeStateNames(bool compress = true) const |
QBindable<QScxmlDataModel *> | bindableDataModel() |
QBindable<QVariantMap> | bindableInitialValues() |
QBindable<bool> | bindableInitialized() const |
QBindable<QList<QScxmlInvokableService *>> | bindableInvokedServices() |
QBindable<QScxmlCompiler::Loader *> | bindableLoader() |
QBindable<QScxmlTableData *> | bindableTableData() |
void | cancelDelayedEvent(const QString &sendId) |
QMetaObject::Connection | connectToEvent(const QString &scxmlEventSpec, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connectToEvent(const QString &scxmlEventSpec, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connectToEvent(const QString &scxmlEventSpec, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connectToState(const QString &scxmlStateName, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connectToState(const QString &scxmlStateName, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection) |
QMetaObject::Connection | connectToState(const QString &scxmlStateName, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection) |
QScxmlDataModel * | dataModel() const |
QVariantMap | initialValues() |
QList<QScxmlInvokableService *> | invokedServices() const |
bool | isActive(const QString &scxmlStateName) const |
bool | isDispatchableTarget(const QString &target) const |
bool | isInitialized() const |
bool | isInvoked() const |
bool | isRunning() const |
QScxmlCompiler::Loader * | loader() const |
QString | name() const |
QList<QScxmlError> | parseErrors() const |
QString | sessionId() const |
void | setDataModel(QScxmlDataModel *model) |
void | setInitialValues(const QVariantMap &initialValues) |
void | setLoader(QScxmlCompiler::Loader *loader) |
void | setRunning(bool running) |
void | setTableData(QScxmlTableData *tableData) |
QStringList | stateNames(bool compress = true) const |
void | submitEvent(QScxmlEvent *event) |
void | submitEvent(const QString &eventName) |
void | submitEvent(const QString &eventName, const QVariant &data) |
QScxmlTableData * | tableData() const |
公共槽
信号
void | dataModelChanged(QScxmlDataModel *model) |
void | finished() |
void | initialValuesChanged(const QVariantMap &initialValues) |
void | initializedChanged(bool initialized) |
void | invokedServicesChanged(const QList<QScxmlInvokableService *> &invokedServices) |
void | loaderChanged(QScxmlCompiler::Loader *loader) |
void | log(const QString &label, const QString &msg) |
void | reachedStableState() |
void | runningChanged(bool running) |
void | tableDataChanged(QScxmlTableData *tableData) |
静态公共成员
QScxmlStateMachine * | fromData(QIODevice *data, const QString &fileName = QString()) |
QScxmlStateMachine * | fromFile(const QString &fileName) |
std::function<void (bool)> | onEntry(const QObject *receiver, const char *method) |
std::function<void (bool)> | onEntry(Functor functor) |
std::function<void (bool)> | onEntry(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method) |
std::function<void (bool)> | onExit(const QObject *receiver, const char *method) |
std::function<void (bool)> | onExit(Functor functor) |
std::function<void (bool)> | onExit(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method) |
受保护的函数
bool | isActive(int stateIndex) const |
详细说明
QScxmlStateMachine是状态图表XML (SCXML)的实现。
所有在SCXML文件中定义的状态都可作为QScxmlStateMachine的属性访问。这些属性是布尔值,表示状态是否处于活动状态或非活动状态。
注意:QScxmlStateMachine 正确工作需要一个 QEventLoop。事件循环用于实现事件的delay
属性,并在接收到嵌套(或父)状态机的事件时调度状态机处理。
属性文档
[可绑定]
dataModel : QScxmlDataModel*
注意:此属性支持QProperty绑定。
此属性包含要用于此状态机的数据模型。
SCXML数据模型在SCXML规范 - 5 数据模型和数据操作中描述。有关支持的数据模型的更多信息,请参阅SCXML遵从性。
状态机已初始化时更改数据模型,在SCXML标准中未指定,可能导致未定义行为。
另请参阅:QScxmlDataModel、QScxmlNullDataModel和QScxmlCppDataModel。
[可绑定]
initialValues : QVariantMap
注意:此属性支持QProperty绑定。
此属性包含设置数据模型时使用的初始值。
另请参阅:QScxmlStateMachine::init()和QScxmlDataModel。
[仅读可绑定]
initialized : bool
注意:此属性支持QProperty绑定。
此属性表示状态机是否已初始化。
如果状态机已初始化,则为true
,否则为false
。
另请参阅:QScxmlStateMachine::init()和QScxmlDataModel。
[只读]
invoked : const bool
此属性表示状态机是否从外部状态机调用。
当状态机作为服务使用<invoke>
元素启动时为true
,否则为false
。
访问函数
bool | isInvoked() const |
[仅读可绑定]
invokedServices : QList<QScxmlInvokableService*>
注意:此属性支持QProperty绑定。
此属性包含从主状态机(可能是递归地)调用的SCXML服务列表。
[可绑定]
loader : QScxmlCompiler::Loader*
注意:此属性支持QProperty绑定。
此属性包含当前用于解决和加载数据模型URI的加载器。
[只读]
name : const QString
此属性包含状态机的名称,该名称由<scxml>
标签的name
属性设置。
访问函数
QString | name() const |
[只读]
parseErrors : const QList<QScxmlError>
此属性包含从 SCXML 文件创建状态机时发生的解析错误列表。
访问函数
QList<QScxmlError> | parseErrors() const |
running : bool
此属性包含此状态机的运行状态
访问函数
bool | isRunning() const |
void | setRunning(bool running) |
通知信号
void | runningChanged(bool running) |
另请参阅 start().
[只读]
sessionId : const QString
此属性包含当前状态机的会话 ID。
会话 ID 用于在父状态机和子状态机之间进行消息路由。如果状态机由一个 <invoke>
元素启动,它发送的任何事件都将设置 invokeid
字段为会话 ID。状态机将使用事件的来源(由 <send>
元素中的 target 或 targetexpr 属性设置)来将消息派发到正确的子状态机。
访问函数
QString | sessionId() const |
另请参阅 QScxmlEvent::invokeId。
[可绑定]
tableData : QScxmlTableData*
注意:此属性支持QProperty绑定。
此属性包含从 SCXML 文件生成 C++ 时使用的表数据。
实现状态机的类将使用此属性来分配生成的表数据。状态机不会假定对表数据的所有权。
成员函数文档
template <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToEvent(const QString &scxmlEventSpec, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
template <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToEvent(const QString &scxmlEventSpec, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
创建从由 scxmlEventSpec 指定的事件到 functor 的给定 type 的连接,其中 functor 可以是泛型或可选 context 对象的成员函数。
接收器的 functor 必须接受一个 QScxmlEvent 参数。
与 SCXML 文档中的事件规范不同,此处不允许在 scxmlEventSpec 中使用空格。为了连接到具有不同前缀的多个事件,必须多次调用 connectToEvent()。
返回连接处理的句柄,可稍后用于断开连接。
模板 <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToState(const QString &scxmlStateName, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
模板 <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToState(const QString &scxmlStateName, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
创建从由 scxmlStateName 指定的状态到 functor 的连接,其中 functor 可以是一个函数对象或可选的 context 对象的成员函数。
接收者的 functor 必须接受一个布尔参数,该参数指示所连接的状态是否变得活跃或非活跃。
返回连接处理的句柄,可稍后用于断开连接。
[调用]
QStringList QScxmlStateMachine::activeStateNames(bool compress = true) const
获取所有活跃状态的状态名称列表。
当一个状态是活跃的,根据定义,所有其父状态都是活跃的。当 compress 为 true
(默认值)时,父状态将被过滤,并且仅返回 叶片状态。当它为 false
时,将返回活跃状态的完整列表。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
[调用]
void QScxmlStateMachine::cancelDelayedEvent(const QString &sendId)
取消具有指定 sendId 的延迟事件。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
QMetaObject::Connection QScxmlStateMachine::connectToEvent(const QString &scxmlEventSpec, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
从由 scxmlEventSpec 指定的事件创建到 receiver 对象的 method 的连接。接收者的 method 可以接受一个 QScxmlEvent 作为参数。例如
void mySlot(const QScxmlEvent &event);
与 SCXML 文档中的事件规范不同,此处不允许在 scxmlEventSpec 中使用空格。为了连接到具有不同前缀的多个事件,必须多次调用 connectToEvent()。
返回连接处理的句柄,可稍后用于断开连接。
QMetaObject::Connection QScxmlStateMachine::connectToState(const QString &scxmlStateName, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
创建一个从由 scxmlStateName 确定的状态到 receiver 对象的 method 的连接,其中 method 可以接受一个布尔参数,该参数指示所连接的状态是否变得活跃或非活跃。例如
void mySlot(bool active);
返回连接处理的句柄,可稍后用于断开连接。
QScxmlDataModel *QScxmlStateMachine::dataModel() const
返回状态机使用的模型。
注意:属性dataModel的获取函数。
另见:setDataModel().
[信号]
void QScxmlStateMachine::finished()
当状态机到达顶级最终状态时,会发出此信号。
另见:running.
[静态]
QScxmlStateMachine *QScxmlStateMachine::fromData(QIODevice *data, const QString &fileName = QString())
通过读取指定的data所述QIODevice创建状态机。
此方法始终返回状态机。如果在读取SCXML文件时发生错误,则无法启动状态机。可以通过调用parseErrors()方法检索错误。
另见:parseErrors.
[静态]
QScxmlStateMachine *QScxmlStateMachine::fromFile(const QString &fileName)
从指定的fileName SCXML文件创建状态机。
此方法始终返回状态机。如果在读取SCXML文件时发生错误,则无法启动状态机。可以通过调用parseErrors()方法检索错误。
另见:parseErrors.
[槽]
bool QScxmlStateMachine::init()
初始化状态机。
状态机初始化包括调用QScxmlDataModel::setup(),设置<data>
元素的初始值,以及执行<scxml>
标签的任何<script>
标签。初始数据值来自initialValues
属性。
如果在解析过程中发生错误或任何初始化步骤失败,则返回false
。否则返回true
。
[可调用]
bool QScxmlStateMachine::isActive(const QString &scxmlStateName) const
如果scxmlStateName指定的状态是活跃的,则返回true
,否则返回false
。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
[保护]
bool QScxmlStateMachine::isActive(int stateIndex) const
如果ID为stateIndex的状态是活跃的,则返回true
。
此方法是SCXML状态机编译表示接口的一部分。它应仅在内部使用,并由SCXML文档编译的状态机使用。
[可调用]
bool QScxmlStateMachine::isDispatchableTarget(const QString &target) const
如果此状态机可以发送到target的消息,则返回true
。
有效的目标有
#_parent
,如果当前状态机通过<invoke>
启动,则为父状态机#_internal
,对于当前状态机#_scxml_sessionid
,其中sessionid
是当前状态机的会话ID#_servicename
,其中servicename
是通过状态机<invoke>
启动的服务的ID或名称
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
bool QScxmlStateMachine::isRunning() const
如果状态机正在运行,则返回 true
,否则返回 false
。
注意:属性 running 的获取函数。
另请参阅:setRunning() 和 runningChanged。
[信号]
void QScxmlStateMachine::log(const QString &label, const QString &msg)
如果SCXML中使用 <log>
标签,则发送此信号。 label 是 <log>
标签的 label 属性的值。 msg 是 <;log>
标签评估的 expr 属性的值。如果没有 expr 属性,则返回空字符串。
[静态]
std::function<void (bool)> QScxmlStateMachine::onEntry(const QObject *receiver, const char *method)
返回一个接受布尔参数的函子,如果该参数为 true
,则将给定的 method 在 receiver 上使用 QMetaObject::invokeMethod() 调用(如果 receiver 尚未删除)。
给定的 method 不应接受任何参数。 method 是普通的方法名称,不是用 SIGNAL()
或 SLOT()
封装。
这对于将处理程序 connectToState 封装起来非常有用,只有当状态被进入时才执行该处理程序。
[静态]
模板 <typename Functor> std::function<void (bool)> QScxmlStateMachine::onEntry(Functor functor)
返回一个接受布尔参数的函子,如果该参数为 true
,则调用给定的 functor。给定的 functor 不接受任何参数。
这对于将处理程序 connectToState 封装起来非常有用,只有当状态被进入时才执行该处理程序。
[静态]
模板 <typename PointerToMemberFunction> std::function<
返回一个接受布尔参数的函子,如果该参数为 true
且 receiver 尚未删除,则调用 receiver 上的给定 method。给定的 method 不接受任何参数。
这对于将处理程序 connectToState 封装起来非常有用,只有当状态被进入时才执行该处理程序。
[静态]
std::function<void (bool)> QScxmlStateMachine::onExit(const QObject *receiver, const char *method)
返回一个接受布尔参数并在该参数为false
且接收者尚未被删除的情况下调用指定方法的仿函数。使用QMetaObject::invokeMethod()通过接收者调用该方法。
给定方法不得接受任何参数。method是方法的纯名称,不包括在SIGNAL(...)或SLOT(...)中。
当状态被离开时,这对于封装connectToState()的处理程序非常有用。
[静态]
模板 <typename Functor> std::function<void (bool)> QScxmlStateMachine::onExit(Functor functor)
返回一个接受布尔参数并在该参数为false
时调用给定仿函数的仿函数。给定仿函数不得接受任何参数。
当状态被离开时,这对于封装connectToState()的处理程序非常有用。
[静态]
模板 <typename PointerToMemberFunction> std::function<void (bool)> QScxmlStateMachine::onExit(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method)
返回一个接受布尔参数并在该参数为false
且接收者尚未被删除的情况下调用给定接收者上指定方法的仿函数。给定方法不得接受任何参数。
当状态被离开时,这对于封装connectToState()的处理程序非常有用。
[信号]
void QScxmlStateMachine::reachedStableState()
在宏步骤结束时事件队列为空或达到最终状态时发出此信号。
[信号]
void QScxmlStateMachine::runningChanged(bool running)
当将running
属性更改时的参数为running时发出此信号。
注意:属性running的通告信号。
void QScxmlStateMachine::setDataModel(QScxmlDataModel *model)
为此状态机设置数据模型model。状态机与模型之间有一个1:1的关系。设置模型一次后,您无法再更改它。使用此方法进一步尝试设置模型将被忽略。
注意:属性dataModel的设置函数。
另请参阅:dataModel。
void QScxmlStateMachine::setRunning(bool running)
如果running为true
,则启动状态机,否则停止。
注意:属性running的设置函数。
另请参阅:start(),stop(),isRunning()和runningChanged()。
[槽函数]
void QScxmlStateMachine::start()
启动此状态机。机器将重置其配置并转到初始状态。当进入最终顶层状态时,机器将发出finished()信号。
注意:状态机在没有运行的事件循环的情况下无法运行,例如使用QCoreApplication::exec() 或 QApplication::exec() 启动的应用程序主事件循环。
另请参阅runningChanged,setRunning,stop,和 finished。
[可调用]
QStringList QScxmlStateMachine::stateNames(bool compress = true) const
获取所有状态的状态名称列表。
当 compress 为 true
(默认值),包含子状态的状态将被过滤,只返回 叶状态。当它为 false
时,将返回所有状态的完整列表。
返回的列表不包含可能嵌套的状态机的状态。
注意:列表中状态名称的顺序是状态在 SCXML 文件中出现的顺序。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
[槽函数]
void QScxmlStateMachine::stop()
停止此状态机。该机器将不再执行任何状态转换。其 running
属性设置为 false
。
另请参阅runningChanged,start,和 setRunning。
[可调用]
void QScxmlStateMachine::submitEvent(QScxmlEvent *event)
将 SCXML 事件 event 提交到内部或外部事件队列,具体取决于事件的优先级。
当设置延迟时,事件将在超时后排队发送。状态机将拥有 event,并在处理后在删除它。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
[可调用]
void QScxmlStateMachine::submitEvent(const QString &eventName)
一个创建并提交具有指定 eventName 作为名称的辅助方法。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
[可调用]
void QScxmlStateMachine::submitEvent(const QString &eventName, const QVariant &data)
一个创建并提交具有指定 eventName 作为名称和数据作为有效载荷数据的辅助方法。
注意:此函数可以通过元对象系统从 QML 调用。请参阅 Q_INVOKABLE。
© 2024 Qt 公司。此处包含的文档贡献是其各自所有者的版权。此处提供的文档根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款进行许可。Qt 和相应的商标是芬兰的 Qt 公司及其它全球国家的注册商标。所有其他商标均为各自所有者的财产。