2010-04-26 5 views
6

Y at-il un moyen d'exposer un objet/une fonction C++ à JavaScript exécuté dans le navigateur QtWebKit dans Qt? Il est possible d'exposer des objets ActionScript au code JS s'exécutant dans le navigateur WebKit dans Adobe AIR - Je recherche des fonctionnalités similaires dans Qt.Expose l'objet C++ à Javascript dans Qt

Répondre

2

Oui. Jetez un oeil à this. Cela devrait être un bon début.

+0

Merci pour l'info! – BlueSilver

4

EDIT: LINK FONCTIONNE, MAIS JUSTE EN CAS LE LIEN SEJOURS DE NOUVEAU [Link] par Richard Moore ...

Une question que j'ai vu venir plusieurs fois sur #qt et qt-intérêts est comment ajouter des API personnalisées (spécifiques aux applications) à celles disponibles par défaut dans QtWebKit. C'est en fait assez facile (une fois que vous savez comment) comme je vais montrer ci-dessous. Ce message affichera un exemple simple de la façon de rendre un objet disponible à partir de javascript, en incluant les méthodes d'appel sur l'objet et en renvoyant les valeurs à partir de C++.

Il y a deux choses que vous avez vraiment besoin de savoir pour effectuer cette intégration , la première est la méthode addToJavaScriptWindowObject() de QWebFrame, cela permet rendra le QObject spécifié visible de javascript. La deuxième chose que vous devez savoir est que les objets publiés en disparaîtront chaque fois que l'objet javascript sera effacé - ie. chaque fois que l'utilisateur navigue vers une nouvelle page. Pour éviter que cela ne provoque des problèmes, QWebFrame fournit un signal qui vous indique chaque fois que l'objet est effacé, ce qui vous permet de rajouter votre API personnalisée. C'est en fait beaucoup plus simple que ça en a l'air!

Le cœur de ce qui est vraiment mis en œuvre deux méthodes dans l'exemple, ils sont ci-dessous:

void MyApi::setWebView(QWebView *view) 
{ 
    QWebPage *page = view->page(); 
    frame = page->mainFrame(); 

    attachObject(); 
    connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject())); 
} 

void MyApi::attachObject() 
{ 
    frame->addToJavaScriptWindowObject(QString("MyApi"), this); 
} 

Ce code est tout ce que vous avez besoin afin de faire toute la emplacements publics de l'objet MyApi visible à javascript. La classe MyApi offre deux slots publics: (! Oui, les créneaux horaires peuvent retourner les choses)

public slots: 
    void doSomething(const QString &param); 
    int doSums(int a, int b); 

La première fente se connecte simplement un message à la sortie de débogage, le deuxième rendement la somme de ses deux arguments . On les appelle de javascript comme ceci:

MyApi.doSomething('Hello from JS page 2!!!!'); 

    sum = MyApi.doSums(2, 3); 
    alert('C++ says the sum is ' + sum); 

Et c'est tout ce qu'il ya à faire! Vous pouvez télécharger le code à partir de>http://xmelegance.org/devel/qtwebkitextension.tar.gz.

+0

Cet exemple n'est pas fonctionnel dans QT5 malheureusement. Une chance pour une mise à jour ou dois-je ouvrir une autre question? – Alex