我正在尝试在 Qt (C++) 中实现状态机。如何检查 QStateMachine 的当前状态?我在文档中找不到方法。
谢谢
你试过QStateMachine::configuration()
吗?
参考http://www.qtcentre.org/threads/42085-How-to-get-the-current-state-of-QStateMachine
摘自上述网址:
// QStateMachine::configuration() gives you the current states.
while(stateMachine->configuration().contains(s2))
{
//do something
}
您可以将该属性分配给 QStateMachine 本身。
// QState m_State1;
// QState m_State2;
// QStateMachine m_Machine;
m_State1.assignProperty(m_Label, "visible", false);
m_State1.assignProperty(&m_Machine, "state", 1);
m_State2.assignProperty(m_Label, "visible", true);
m_State2.assignProperty(&m_Machine, "state", 2);
然后,可以从动态属性中读取当前状态。
qDebug() << m_Machine.property("state");
QSet QStateMachine::configuration() 常量
返回此状态机当前处于的最大一致状态集(包括并行和最终状态)。如果状态 s 在配置中,则总是 s 的父级也在 c 中。但是请注意,机器本身并不是配置的显式成员。
示例用法:
bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const
{
if (aMachine_.configuration().contains(aState)) return true;
return false
}
我意识到我迟到了,但希望这个答案可以帮助其他任何偶然发现这个问题的人。
您在上面提到您已经尝试使用 configuration(),但是您的任何状态都不存在——这是因为 start() 是异步的。
因此,假设您在调用 start() 后立即调用了 configuration(),那么您的状态还不存在是有道理的。您可以使用 QStateMachine 类的 started() 信号获得所需的功能。看看这个:
stateMachine->setInitialState(someState);
stateMachine->start();
connect(stateMachine, SIGNAL(started()), this, SLOT(ReceiveStateMachineStarted()));
然后,对于您的 ReceiveStateMachineStarted() 插槽,您可以执行以下操作:
void MyClass::ReceiveStateMachineStarted() {
QSet<QAbstractState*> stateSet = stateMachine->configuration();
qDebug() << stateSet;
}
当您的状态机进入其初始状态时,它将发出 start() 信号。您编写的插槽将听到并打印配置。有关这方面的更多信息,请参阅以下 Qt 文档: