C++ Qt: проверить текущее состояние QStateMachine

Я пытаюсь реализовать конечный автомат в Qt (C++). Как я могу проверить текущее состояние QStateMachine? Я не мог найти метод в документации.

Спасибо

4 ответа

Решение

Ты пытался QStateMachine::configuration()?

см. http://www.qtcentre.org/threads/42085-How-to-get-the-current-state-of-QStateMachine

Выдержка из приведенного выше URL:

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

Из документации Qt 5.7

QSet QStateMachine::configuration() const

Возвращает максимальный непротиворечивый набор состояний (включая параллельные и конечные состояния), в которых в данный момент находится этот конечный автомат. Если состояние s находится в конфигурации, это всегда тот случай, когда родительский элемент s также находится в c. Однако обратите внимание, что сама машина не является явным членом конфигурации.

Пример использования:

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

Я понимаю, что опаздываю, но, надеюсь, этот ответ поможет всем, кто сталкивается с этим.

Вы упомянули выше, что вы уже пытались использовать конфигурацию (), но ни одно из ваших состояний там не было - это потому, что start() является асинхронным.

Итак, предполагая, что вы вызвали configuration() сразу после вызова start(), имеет смысл, что ваши состояния еще не были там. Вы можете получить желаемую функциональность, используя сигнал begin () класса QStateMachine. Проверьте это:

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

Другие вопросы по тегам