Я пишу пользовательский интерфейс мастера на основе объекта QWizard Qt. Есть одна конкретная ситуация, когда я хочу, чтобы пользователь входил в службу, используя хост, имя пользователя и пароль. Затем остальная часть мастера манипулирует этим сервисом для выполнения различных задач настройки. Вход в систему может занять некоторое время, особенно в случаях ошибок, когда DNS-имя требует много времени для разрешения - или, возможно, оно может даже не решить вообще.
Так что моя идея состоит в том, чтобы сделать все три поля обязательными с помощью механизма registerField, и когда пользователь нажимает кнопку Далее, мы показываем небольшой пульсатор на странице мастера, говорящий «Соединение с сервером, пожалуйста, подождите ...», пока мы пытаемся подключиться в фоновом режиме. Если соединение установлено успешно, мы переходим на следующую страницу. Если нет, мы выделяем поле, вызывающее проблемы, и просим пользователя повторить попытку.
Однако я не знаю, как этого добиться. Варианты, о которых я подумал:
1) Переопределите validatePage и запустите поток в фоновом режиме. Введите ожидание внутри validatePage (), которое прокачивает цикл событий Qt, пока поток не завершится. Вы могли бы подумать, что это было самое уродливое решение, но ...
2) Скройте настоящую кнопку «Далее» и добавьте пользовательскую кнопку «Далее», которая при нажатии отправляет мою долгосрочную функцию в потоке и ожидает, когда что-то подаст сигнал «проверка завершена». Когда это происходит, мы вручную вызываем QWizard :: next () (и мы полностью игнорируем реальную логику проверки от validatePage и друзей.) Это еще уродливее, но переносит уродство на другой уровень, который может упростить разработку.
Конечно, есть лучший способ?