2011-12-15 1 views
7

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

ТНХ

+0

У меня такая же проблема. Итерируя QSet, который :: configuration предоставляет мне QAbstractState, который не имеет четкого использования. Рабочий пример был бы замечательным. – ExpatEgghead

+0

@ExpatEgghead, пожалуйста, обратитесь к http://stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-to-work, это может помочь вам –

+0

@ExpatEgghead: Какая у вас версия Qt, 4.7 или 4.8 ? – menjaraz

ответ

13

вы пробовали 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 
} 
+0

Ну да, но когда я попробовал, ни один из штатов, которые я добавил, не был там. У меня нет моих собственных классов QState, просто регулярных QStates. – ExpatEgghead

+0

Как часть моего приложения, мне нужно отправить на другое устройство текущее состояние приложения. Не кажется разумным охотиться через Набор для этого. Возможно, моя ошибка заключалась не в создании производного класса для всех моих государств. – ExpatEgghead

+0

@ExpatEgghead: Я считаю, что вы можете получить больше внимания, если можете предоставить минимальный полный код, иллюстрирующий вашу проблему. – menjaraz

5

Вы можете присвоить свойству самого 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"); 
0

От Qt 5.7 Documentation

QSet QStateMachine :: конфигурации() сопзЬ

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

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

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

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

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

Итак, предположив, что вы вызвали конфигурацию() сразу после вызова start(), имеет смысл, что ваши состояния еще не были. Вы можете получить необходимую функциональность, используя начальный() сигнал класса 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

Смежные вопросы