Использование QNetworkAccessManager::authenticationRequired с собственным виджетом ввода / асинхронно

В настоящее время я разрабатываю браузер с Qt, который имеет vim-подобную строку ввода:

пример строки состояния

Это в основном просто QHBoxLayout с QLineEdit и немного QLabelв этом.

Теперь я хотел бы обработать HTTP-аутентификацию. Обычное, что я вижу в других проектах - это открытие модального QDialog а потом звонит exec() на нем внутри слота, подключенного к сигналу аутентификации Required.

Теперь я хотел бы использовать ту же строку состояния, чтобы запрашивать у пользователя информацию для аутентификации, т.е. отображать какое-то приглашение и затем использовать QLineEdit для ввода информации.

Моя проблема - блоки слотов authenticationRequired, я не могу просто продолжать работать в основном цикле и продолжить запрос с информацией аутентификации, добавленной, когда пользователь закончил.

Я думал о двух решениях:

  • Реализация некоторой функции, которая получает значения из строки состояния при вызове QCoreApplication::processEvents пока нет ответа от пользователя. Однако я не уверен, что это хорошая идея, и будет ли приложение перегружать процессор, пока я не вернусь к реальному циклу событий.

  • Каким-то образом сохранить и прервать запрос, запросить у пользователя аутентификацию, а затем заново создать запрос, как только будет добавлена ​​информация об аутентификации. Но, похоже, я не могу просто клонировать QNetworkReply а затем позвоните abort() на оригинальный ответ и возобновить его позже.

Смотря как QDialog::exec() реализовано, кажется, они создают новый QEventLoop с недокументированным значением QEventLoop::DialogExec прошло. Интересно, смогу ли я сделать то же самое, но тогда я не уверен, как бы я вышел из цикла обработки событий, когда пользовательский ввод будет там.

Какая из этих идей звучит как самая вменяемая?

1 ответ

Решение

Вы можете просто использовать QEventLoop без каких-либо специальных недокументированных значений. Вместо этого у вас будет что-то вроде:

QEventLoop loop;
connect(editBox, SIGNAL(finishedEditing()), &loop, SLOT(quit()));
loop.exec();

И это запустит новый цикл обработки событий, который блокирует, ожидая вашего ввода (не загружая столько процессоров, сколько processEvents)

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