web-dev-qa-db-fra.com

Comment utiliser Qt WebEngine et QWebChannel?

J'utilise le nouveau WebEngine pour jouer et apprendre. J'ai essayé de trouver des méthodes similaires trouvées avec Qt WebKit: addToJavaScriptWindowObject()

J'ai découvert qu'en utilisant Qt WebEngine, je devais utiliser la variable QWebChannel pour enregistrer des fonctions dans l'objet window Javascript. Si cela est correct, cela me mène à la question suivante.

J'ai installé Qt 5.4.0 sur mon ordinateur. J'ai remarqué que qwebchannel.js ne se trouve pas dans le SDK installé sur mon ordinateur. Je l'ai trouvé sur la source Git.

Si j'ai une application de bureau native Qt avec QWebEnginePage et QWebEngineView, de quoi ai-je besoin pour pouvoir enregistrer des fonctions sur l'objet de fenêtre Javascript?

Mon application de bureau accède automatiquement à une page http que j'ai créée. J'ai donc accès au contenu connecté à la QWebEngineView.

Quelles sont les étapes à suivre pour que cela fonctionne?

14
user1185305

Dans Qt5.6, si vous voulez que la partie C++ et le code JavaScript communiquent, la seule façon de le faire consiste à utiliser QWebChannel sur un QWebEngineView , comme vous l'avez indiqué. Vous le faites de cette façon dans le fichier .cpp:

m_pView = new QWebEngineView(this);
QWebChannel * channel = new QWebChannel(page);
m_pView->page()->setWebChannel(channel);
channel->registerObject(QString("TheNameOfTheObjectUsed"), this);

Ici, vous venez de dire que vous enregistrez un objet nommé TheNameOfTheObjectUsed qui sera disponible du côté JS. Maintenant, voici la partie du code à utiliser du côté JS:

new QWebChannel(qt.webChannelTransport, function (channel) {
            // now you retrieve your object
            var JSobject = channel.objects.TheNameOfTheObjectUsed;
        });

Maintenant, si vous voulez récupérer certaines propriétés de la classe du côté JS, vous devez avoir une méthode du côté C++ qui retourne une chaîne, un entier, un long ... C'est à quoi ça ressemble du côté C++ , dans votre .h:

Q_INVOKABLE int getInt();
Q_PROPERTY(int myIntInCppSide READ getInt);

Et maintenant, vous obtenez l'int comme ceci du côté JS:

var myIntInJSside= JSobject.myIntInCppSide;

C'est une explication très simple, et je vous recommande de regarder cette vidéo qui m'a été très utile. En outre, vous voudrez peut-être en savoir plus sur le API JavaScript fourni par QWebChannel, ainsi que sur la documentation relative à QWebChannel .

J'espère que cela pourra aider!

13
IAmInPLS

Qt a la documentation à ce sujet maintenant:

Exemple Qt WebChannel Standalone

Vous devez ajouter une QWebSocketServer à votre application cpp à laquelle le code HTML/Javascript de la QWebEngineView se connectera à l'aide d'un WebSocket. Utilisez ensuite QWebChannel pour une communication bidirectionnelle.

0
bendiy