2016-08-25 3 views
1

Ich habe eine Qt-Anwendung, die einen Webbrowser einbettet (QWebEngineView). Ich möchte eine JavaScript-Funktion mit einem String-Argument aus der C++ - Anwendung aufrufen. Das heißt:Wie kann ich eine Zeichenfolge umgehen, um sicherzustellen, dass es sich um ein gültiges Zeichenfolgenliteral in der JS-Quelle handelt?

page()->runJavaScript("setContent(\"hello\");"); 

Dies funktioniert in einfachen Fällen. Allerdings, wenn ich versuchen und Last, sagen wir, eine C++ Quelldatei und verwenden, die als Parameter von setContent, wird diese brechen, weil ich die Zeichenfolge wie diese nicht einfach zusammenstellen können:

auto js = QString("setContent(\"%1\");").arg(fileStr); 

habe ich versucht, die folgende :

Aber anscheinend konnte das der Zeichenkette nicht entkommen, ich erhalte einen Fehler, wenn ich dieses Javascript nenne. Wie kann ich einen langen String mit Zeilenumbrüchen und möglichen Sonderzeichen umgehen, damit ich ein gültiges js-Fragment konstruieren kann?

Antwort

0

Also, nach ein paar Recherchen stieß ich auf QWebChannel, die für bidirektionale Kommunikation zwischen der Anwendung und der gehosteten Webseite gedacht ist. Die importierten qwebchannel.js in den Beispielen finden Sie here. Von dort ist es das, was ich getan habe:

In C++:

auto channel = new QWebChannel(this); 
    page()->setWebChannel(channel); 
    channel->registerObject("doc", Doc); 

In HTML/JS:

new QWebChannel(qt.webChannelTransport, 
     function(channel) { 
     var doc = channel.objects.doc; // this is "doc" from the registerObject call 
     editor.setValue(doc.text); 
     doc.textChanged.connect(updateText); // textChanged is a signal of the class of doc. 
     } 
    ); 

Also, auch wenn diese nicht direkt auf die Frage nicht beantworten, was präsentiert wird Hier kann der gleiche Effekt erzielt werden.

Verwandte Themen