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

0

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

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

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

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

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

Теги:
qt
qstatemachine

1 ответ

0

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

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() диалоговым accepted() или finished(int) сигналам, чтобы получить результат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню