Использование 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)