Синхронизация QStateMachine (показывает неблокирующее диалоговое окно с помощью сигнала QState enter ())

При вводе QState в QStateMachine несколько свойств объекта Widget устанавливаются с помощью assignProperty(), а сигнал input () используется для запуска метода Slot, который выполняет exec()s a QDialog.

Это в основном работает, но диалоговое окно создается до того, как назначены свойства, что нежелательно, так как свойства назначаются только после закрытия диалогового окна.

Точный порядок не был критичным, если бы диалог не блокировался (что именно он "блокирует"?). Человеческое восприятие должно быть "одновременным".

Решение сделало бы диалоговое окно неблокирующим или гарантировало бы, что свойства установлены перед выполнением диалога.

Сейчас я попытаюсь использовать однократный QTimer для задержки слота, в котором выполняется exec () QDialog, но, конечно, я все еще ищу правильное решение, даже если это должно сработать.

1 ответ

В настоящее время идиоматическое решение состоит в том, чтобы иметь два состояния: первое - для установки свойств, второе - для отображения виджета:

QStateMachine machine;
auto * s1 = QState(&machine);
auto * s2 = QState(&machine);
machine.setInitialState(s1);
s1->assignProperty(widget, "property", value);
...
s1->addTransition(s2);
connect(s2, SIGNAL(entered()), widget, SLOT(exec()));
//or
s2->assignProperty(widget, "visible", true);
machine.start();

Обратите внимание, что QDialog::exec() это слот, так что вам не нужен пользовательский слот только для exec() диалог. Подключите слот к диалогу accepted() или же finished(int) сигналы для получения результата.

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