При входе в QState в QStateMachine некоторые свойства объекта Widget устанавливаются с помощью assignProperty (), а сигнал enter () используется для запуска метода Slot, который выполняет exec () с помощью QDialog.
Это в основном работает, но диалоговое окно создается до того, как назначены свойства, что нежелательно, так как свойства назначаются только после закрытия диалогового окна.
Точный порядок не был критичным, если бы диалог не блокировался (что именно он «блокирует»?). Человеческое восприятие должно быть «одновременным».
Решение может сделать диалоговое окно неблокирующим или гарантировать, что свойства будут установлены до его запуска.
Сейчас я попытаюсь использовать однократный QTimer для задержки слота, в котором выполняется exec () QDialog, но, конечно, я все еще ищу правильное решение, даже если это должно сработать.
В настоящее время идиоматическое решение состоит в том, чтобы иметь два состояния: первое — для установки свойств, второе — для отображения виджета:
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)
сигналы для получения результата.
Других решений пока нет …