В настоящее время мы переносим проект с 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();
}
})
Очевидно, что этот подход очень ограничен в том смысле, что конечные точки, которые приводят к загрузке, должны быть жестко закодированы в приложении. Однако я не вижу лучшего решения. Кто-нибудь придумал что-нибудь лучше?
- Обновление -
Документы из Qt 5.5. План выпуска описывает среди других улучшений элемент управления разработчиком веб-кеша и файлов cookie следующую функцию.
Добавлен API для управления загрузкой файлов
5.5 beta предназначено для выпуска 09/04/2015, а финальный релиз - 26/05/2015.
Чтобы предотвратить дальнейшую травму головы, возможно, стоит просто ждать этих улучшений.
Сказав это, меня все равно будет интересовать более чистое решение, чем мое, если у кого-нибудь есть.