В настоящее время мы переносим проект с QtWebkit
на QWebEngine
. Однако обработка загрузок вызывает некоторую головную боль. Ранее мы обрабатывали это с помощью сигнала QWebPage::unsupportedContent
, например:
QWebPage* webPage = new QWebPage(this);
QObject::connect(webPage, &QWebPage::unsupportedContent, [] (QNetworkReply* reply) {
// do stuff with the reply
reply->readAll();
});
При использовании QtWebEngine
единственное, о чем я могу думать, это использовать сигнал QWebEngineView::urlChanged
для запроса к серверу, и я даже не уверен, что это сработает.
QNetworkAccessManager* accessManager = new QNetworkAccessManager(this);
QWebEngineView* webView = new QWebEngineView(this);
QObject::connect(webView, &QWebEngineView::urlChanged, [=] (const QUrl& url) {
if (url.path().endsWith("some_endpoint_which_results_in_a_download") {
QNetworkReply* reply = accessManager->get(url);
// do the same stuff to the reply
reply->readAll();
}
})
Очевидно, что этот подход очень ограничен тем, что конечные точки, которые приводят к загрузке, должны быть жестко закодированы в приложении. Однако лучшего решения я не вижу. Кто-нибудь придумал что-нибудь лучше?
-- Обновлять --
Документы из плана выпуска 5.5 Qt описывают, среди прочих улучшений, контроль над веб-кэшем и файлами cookie, следующая функция.
Добавлен API для управления загрузкой файлов
Бета-версия 5.5 предназначена для выпуска 04.09.2015, а финальная — 26.05.2015.
Чтобы предотвратить дальнейшую травму головы, возможно, стоит просто подождать этих улучшений.
Сказав это, я все равно был бы заинтересован в более чистом решении, чем мое, если у кого-то оно есть.