C++ Qt:检查QStateMachine的当前状态

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

我有同样的问题。迭代 ::configuration 提供的 QSet 会得到 QAbstractState,但它没有明显的用途。一个可行的示例将是很好的。 - ExpatEgghead
@ExpatEgghead 请参考 https://dev59.com/M3E85IYBdhLWcg3w8IbK 这个链接,它可能会对你有所帮助。 - Hemant Metalia
@ExpatEgghead:你的Qt版本是4.7还是4.8? - menjaraz
4个回答

16

是的,但是当我尝试时,我添加的所有状态都不在那里。我没有自己的QState类,只有常规的QStates。 - ExpatEgghead
作为我的应用程序的一部分,我需要将应用程序的当前状态发送到另一台机器。在集合中查找这个状态似乎不太明智。也许我的错误是没有为所有状态创建一个派生类。 - ExpatEgghead
@ExpatEgghead: 我认为如果您能提供最简单和完整的代码来说明您的问题,您可能会得到更多的关注。 - menjaraz

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");

3

来自Qt 5.7文档

QSet QStateMachine::configuration() const

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

示例用法:

bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const
{
   if (aMachine_.configuration().contains(aState)) return true;
   return false
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接