我在尝试建立一个由主状态机编排,执行不同任务的子状态机系统。作为Qt的长期用户,我研究了Qt 5.8中的新SCXML实现。然而,我无法弄清楚如何使用5.8提供的API来正确地实现子状态机。
我的想法是使用一个主状态机,然后在主状态机的状态中调用特定的子状态机。虽然调用子状态机可以工作,但我无法在顶级状态机对象发出invokedServicesChanged(..)后访问它们。我可以访问指向QScxmlInvokableService的指针,但无法访问有关的状态机。
此外,顶层状态机对象仅公开来自顶层的状态和事件,并未公开来自调用状态机的状态和事件。例如,topLevelStateMachine->activeStateNames()只列出顶级状态。
查看Qt的源代码,我发现QScxmlInvokableService实际上是QScxmlScxmlService的基类,后者包含有关状态机的指针。不幸的是,QScxmlScxmlService定义在qscxmlinvokableservice_p.h中,这是私有的,因为名称中的“_p”表示它是私有的。那么我该如何使用公共SCXML API呢?我错过了什么吗?我记得SCXML支持在5.7中是技术预览,但现在已经作为正常发行版的一部分包含在5.8中。
我的想法是使用一个主状态机,然后在主状态机的状态中调用特定的子状态机。虽然调用子状态机可以工作,但我无法在顶级状态机对象发出invokedServicesChanged(..)后访问它们。我可以访问指向QScxmlInvokableService的指针,但无法访问有关的状态机。
此外,顶层状态机对象仅公开来自顶层的状态和事件,并未公开来自调用状态机的状态和事件。例如,topLevelStateMachine->activeStateNames()只列出顶级状态。
查看Qt的源代码,我发现QScxmlInvokableService实际上是QScxmlScxmlService的基类,后者包含有关状态机的指针。不幸的是,QScxmlScxmlService定义在qscxmlinvokableservice_p.h中,这是私有的,因为名称中的“_p”表示它是私有的。那么我该如何使用公共SCXML API呢?我错过了什么吗?我记得SCXML支持在5.7中是技术预览,但现在已经作为正常发行版的一部分包含在5.8中。
QT+= scxml_private
添加到项目中,并使用实现细节来完成您需要完成的工作。那个Qt模块相当新,确实缺少许多必要的部分,以使其有用。 - Kuba hasn't forgotten Monica.scxml
状态机,还是指复合状态?如果是前者,为什么不使用后者? - Phrogz