QT QWebEnginePage :: setWebChannel () Transportobjekt

8

Ich verwende das QT WebEngine-Framework, um Webseiten anzuzeigen. Ich injiziere Javascript in eine Seite, wenn es geladen wird, und möchte dem Javascript erlauben, auf ein QT-Objekt zugreifen zu können. Anscheinend muss dazu ein QWebChannel vorhanden sein, der eine IPC zwischen Chrom (dem Javascript) und dem Rest meines C ++ / QT-Projekts herstellt. Ich bin auf die Funktion QWebEnginePage :: setWebChannel (QWebChannel * channel) gestoßen, kann jedoch keine Beispiele für ihre Verwendung finden. Die Dokumentation ( Ссылка ) erwähnt, dass qt.webChannelTransport im JavaScript-Kontext verfügbar sein sollte, aber ich nicht sehen, wo das in qwebchannel.js eingerichtet ist ( Ссылка ). Ich habe die WebChannel-Beispiele ( Ссылка ) gesehen und möchte, wenn möglich, WebSockets vermeiden.

Im Folgenden habe ich versucht, den Web-Kanal zu implementieren.

Immer wenn eine Seite geladen wird, stelle ich einen Kanal her und injiziere das Javascript in C ++:

%Vor%

In Javascript:

%Vor%

Was dazu führt, dass der Kanal nicht richtig verbunden ist (angenommen, dies liegt an qt.webChannelTransport, wie es funktionierte, als ich WebSockets verwendete). Alle Verweise auf Beispiele von QWebChannel, die auf diese Weise mit QWebEnginePage eingerichtet werden, werden ebenfalls geschätzt.

    
mathieujofis 10.08.2015, 20:22
quelle

1 Antwort

21

Kurze Antwort: Fügen Sie <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script> zu Ihrer HTML-Seite hinzu (bevor Sie natürlich new QWebChannel aufrufen) und entfernen Sie die Zeile view->page()->runJavaScript(qwebjs); //this is qwebchannel.js aus Ihrem C ++ - Code.

Lange Antwort:

Ich hatte auch eine Menge Probleme herauszufinden, wie QWebChannel ohne WebSockets richtig zu verwenden - es geschafft, es nach dem Graben in Qt 5.5 Quellcode und Mailing-Listen zu arbeiten (Dokumentation fehlt noch). Beachten Sie, dass dies nur mit dem neuen Qt 5.5 funktioniert .

So verwenden Sie QWebChannel:

%Vor%

Und auf der JS-Seite:

%Vor%

Stellen Sie außerdem sicher, dass Sie QT += webenginewidgets webchannel zu Ihrer .pro -Datei hinzugefügt haben, da dies sonst nicht möglich ist!

Bonus: Sie können Ihr JavaScript nun bequem mit Chrome Dev Tools debuggen! Fügen Sie das einfach irgendwo in Ihrem Qt-Code hinzu (idealerweise beim Start Ihrer Anwendung):

%Vor%

Starten Sie dann Ihre Anwendung, navigieren Sie in Chrome zu http://localhost:23654 und Sie erhalten einen voll funktionsfähigen JS-Debugger, Profiler, eine Konsole usw.:)

Follow-up (19.04.2016): Wenn Ihr Remote-Debugger nicht funktioniert, beachten Sie, dass der qputenv -Aufruf auch vor Aufrufen erfolgen muss an QWebEngineSettings oder jede andere WebEngine-bezogene Klasse, da diese den WebEngine "zygote" -Prozess sofort auslösen (die Zygote ist der übergeordnete QtWebEngineProcess, von dem alle zukünftigen QtWebEngineProcesses abgeleitet werden) und qputenv kann sich nicht darauf auswirken. Habe ein paar Stunden damit verbracht, das aufzuspüren.

    
Vicky Chijwani 12.08.2015, 13:29
quelle

Tags und Links