C ++ Qt: проверить текущее состояние QStateMachine - PullRequest
9 голосов
/ 15 декабря 2011

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

thx

Ответы [ 4 ]

14 голосов
/ 15 декабря 2011

Вы пробовали 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
}
7 голосов
/ 18 марта 2015

Вы можете присвоить свойство самому 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");
1 голос
/ 14 января 2017

С 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
}
0 голосов
/ 09 марта 2018

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

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

Итак, если вы вызвали конфигурацию () сразу после вызова 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;
}

Когда ваш конечный автомат переходит в исходное состояние, он издает сигнал запуска (). Слот, который вы написали, услышит это и распечатает конфигурацию. Подробнее об этом смотрите в следующей документации Qt:

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

...