2015-03-23 20 views
29

Wir sind derzeit ein Projekt von der QtWebkit auf die migrieren. Die Handhabung von Downloads verursacht jedoch ein wenig Kopfschmerzen. Zuvor behandeln wir dies das QWebPage::unsupportedContent Signal verwenden, etwa so:Handhabung Downloads in QtWebEngine

QWebPage* webPage = new QWebPage(this); 

QObject::connect(webPage, &QWebPage::unsupportedContent, [] (QNetworkReply* reply) { 
    // do stuff with the reply 
    reply->readAll(); 
}); 

Wenn QtWebEngine verwenden, das einzige, was ich denken kann, ist das QWebEngineView::urlChanged Signal zu verwenden, um eine Anfrage an den Server zu machen, und ich bin nicht einmal sicher, wenn das funktioniert.

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(); 
    } 
}) 

Offensichtlich dieser Ansatz einschränkend ist sehr, dass die Endpunkte, die in einem Download führen in die Anwendung hartcodiert werden müssen. Ich sehe jedoch keine bessere Lösung. Hat jemand sich etwas besseres einfallen lassen?

- Update -

Die Docs aus 5.5 Release plan Umrisse von Qt unter anderem Verbesserungen der Kontrolle der Entwickler über den Web-Cache und die Cookies, die folgende Funktion.

Added API für

ist

5,5 Beta für die Freigabe Herunterladen von Dateien verwalten soll auf 2015.09.04 und die letzte für die Veröffentlichung auf 26/05/2015.

Um weitere Kopfverletzungen zu vermeiden, kann es sich lohnen, nur auf diese Verbesserungen zu warten.

Nachdem ich das gesagt habe, wäre ich immer noch an einer saubereren Lösung als meiner interessiert, wenn jemand eine hat.

+0

Wir mussten eine ähnliche Entscheidung treffen und entschieden uns dazu, bei Webkit zu bleiben, bis die Blinzelintegration abgeschlossen ist. Es fehlt auch die Anfrageänderung über QNetworkManager und noch kein Ausdruck. Ein Beispiel, wie Sie dies mit Qt 5.5 lösen können, finden Sie im [Otter Browser] (https://github.com/OtterBrowser/otter-browser/blob/master/src/modules/backends/web/qtwebengine/QtWebEngineWebWidget .cpp # L122) und die [Qt-Quellen] (http://code.qt.io/cgit/qt/qtwebengine.git/tree/src/webenginewidgets/api/qwebengineprofile.h#n106). – elsamuko

+0

@StickyCube Können Sie mir bitte mitteilen, wie Sie die Web-Engine gestartet haben? Ich versuche, Quicknanobrowser als ./quicknanobrowser-Plattform Wayland zu verwenden. Aber die App stürzt beim Abspielen der Youtube-Videos ab. Bitte schreiben Sie mir, wenn Sie einen Vorschlag haben. –

Antwort

3

QtWebEngine verwaltet Downloads über die QWebEngineProfile-Klasse mit dem downloadRequested-Signal.