Я пытаюсь реализовать государственную машину в Qt (C++). Как проверить текущее состояние QStateMachine? Не удалось найти метод в документации.C++ Qt: проверить текущее состояние QStateMachine
ТНХ
Я пытаюсь реализовать государственную машину в Qt (C++). Как проверить текущее состояние QStateMachine? Не удалось найти метод в документации.C++ Qt: проверить текущее состояние QStateMachine
ТНХ
вы пробовали 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
}
Ну да, но когда я попробовал, ни один из штатов, которые я добавил, не был там. У меня нет моих собственных классов QState, просто регулярных QStates. – ExpatEgghead
Как часть моего приложения, мне нужно отправить на другое устройство текущее состояние приложения. Не кажется разумным охотиться через Набор для этого. Возможно, моя ошибка заключалась не в создании производного класса для всех моих государств. – ExpatEgghead
@ExpatEgghead: Я считаю, что вы можете получить больше внимания, если можете предоставить минимальный полный код, иллюстрирующий вашу проблему. – menjaraz
Вы можете присвоить свойству самого 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");
QSet QStateMachine :: конфигурации() сопзЬ
Возвращает максимальное последовательное множество состояний (включая параллельные и конечное состояния), что это состояние машины в настоящее время. Если состояние s находится в конфигурации, всегда бывает, что родительский элемент s также находится в c. Обратите внимание, однако, что сама машина не является явным членом конфигурации.
Пример использования:
bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const
{
if (aMachine_.configuration().contains(aState)) return true;
return false
}
Я понимаю, что я иду в последнее время, но, надеюсь, этот ответ поможет кому-то, кто натыкается на это.
Вы упомянули выше, что вы уже пытались использовать 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 документации:
У меня такая же проблема. Итерируя QSet, который :: configuration предоставляет мне QAbstractState, который не имеет четкого использования. Рабочий пример был бы замечательным. – ExpatEgghead
@ExpatEgghead, пожалуйста, обратитесь к http://stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-to-work, это может помочь вам –
@ExpatEgghead: Какая у вас версия Qt, 4.7 или 4.8 ? – menjaraz