Асинхронная проверка в QWizard - PullRequest
0 голосов
/ 25 января 2011

Я пишу пользовательский интерфейс мастера на основе объекта QWizard Qt. Есть одна конкретная ситуация, когда я хочу, чтобы пользователь входил в службу, используя хост, имя пользователя и пароль. Затем остальная часть мастера манипулирует этим сервисом для выполнения различных задач настройки. Вход в систему может занять некоторое время, особенно в случаях ошибок, когда DNS-имя требует много времени для разрешения - или, возможно, оно может даже не решить вообще.

Так что моя идея состоит в том, чтобы сделать все три поля обязательными с помощью механизма registerField, и когда пользователь нажимает кнопку Далее, мы показываем небольшой пульсатор на странице мастера, говорящий «Соединение с сервером, пожалуйста, подождите ...», пока мы пытаемся подключиться в фоновом режиме. Если соединение установлено успешно, мы переходим на следующую страницу. Если нет, мы выделяем поле, вызывающее проблемы, и просим пользователя повторить попытку.

Однако я не знаю, как этого добиться. Варианты, о которых я подумал:

1) Переопределите validatePage и запустите поток в фоновом режиме. Введите ожидание внутри validatePage (), которое прокачивает цикл событий Qt, пока поток не завершится. Вы могли бы подумать, что это было самое уродливое решение, но ...

2) Скройте настоящую кнопку «Далее» и добавьте пользовательскую кнопку «Далее», которая при нажатии отправляет мою долгосрочную функцию в потоке и ожидает, когда что-то подаст сигнал «проверка завершена». Когда это происходит, мы вручную вызываем QWizard :: next () (и мы полностью игнорируем реальную логику проверки от validatePage и друзей.) Это еще уродливее, но переносит уродство на другой уровень, который может упростить разработку.

Конечно, есть лучший способ?

Ответы [ 2 ]

5 голосов
/ 25 января 2011

Это не так визуально привлекательно, но вы можете добавить соединительную страницу и перейти на эту страницу.Если соединение установлено успешно, вызовите next() в мастере, а если соединение не удалось, вызовите previous() и выделите соответствующие поля.Преимущество в том, что код относительно прост.

0 голосов
/ 07 февраля 2011

Мой последний выбор был # 2 (переопределить кнопку «Далее», смоделировать ее поведение, но захватить события ее нажатия вручную и делать то, что я хочу с ней.) Написание клея для определения поведения кнопки «Далее» было минимальным, и я смог создать подкласс QWizardPage с несколькими хуками, которые позволили мне запустить мою задачу на той же странице, вместо того, чтобы переключаться на промежуточную страницу и беспокоиться о том, идти вперед или назад. Спасибо, Калеб, за твой ответ.

...