12

我正在尝试在 Qt (C++) 中实现状态机。如何检查 QStateMachine 的当前状态?我在文档中找不到方法。

谢谢

4

4 回答 4

15

你试过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
}
于 2011-12-15T12:11:01.400 回答
8

您可以将该属性分配给 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");
于 2015-03-18T04:46:24.293 回答
3

来自Qt 5.7 文档

QSet QStateMachine::configuration() 常量

返回此状态机当前处于的最大一致状态集(包括并行和最终状态)。如果状态 s 在配置中,则总是 s 的父级也在 c 中。但是请注意,机器本身并不是配置的显式成员。

示例用法:

bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const
{
   if (aMachine_.configuration().contains(aState)) return true;
   return false
}
于 2017-01-14T14:39:36.530 回答
2

我意识到我迟到了,但希望这个答案可以帮助其他任何偶然发现这个问题的人。

您在上面提到您已经尝试使用 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 文档:

http://doc.qt.io/qt-5/qstatemachine.html#started

于 2018-03-09T19:10:46.137 回答