Синхронизировать QStateMachine
У меня есть класс, внутреннее состояние которого определяет макет в файле QML. Теперь это внутреннее состояние в основном определяется конечным автоматом. Однако часть этого не определяется конечным автоматом, а вместо этого полагается на другие переменные-члены, которые должны быть установлены. У меня следующая ситуация:
void foo()
{
emit stateChange1();
...
mMember = true;
}
Вот stateChange1()
может изменить состояние конечного автомата, что приведет к изменениям в qml). mMember напрямую меняет qml. Теперь моя проблема заключается в том, что крайне важно обрабатывать (возможные) изменения состояния, подразумеваемые statechange1()
до изменения состояния, подразумеваемого настройкой mMember
, Однако, поскольку QStateMachine работает асинхронно, я не могу этого гарантировать. Есть ли элегантные решения для этой проблемы?
1 ответ
Скорее всего, вам нужно отправить операцию либо в очередь событий потока, либо в очередь событий конечного автомата - таким образом, она будет выполнена после выполнения других операций.
Используя код из этого ответа, преобразуйте код следующим образом:
template <typename F>
static void postToStateMachine(F && fun, QStateMachine * sm) {
sm->postEvent(new detail::FEvent<F>(std::forward<F>(fun)));
}
void Class::foo() {
emit stateChange1();
...
postToObject([this]{ mMember = true; }, this);
// or
postToStateMachine([this]{ mMember = true; });
}