2010-04-26 7 views
6

Gibt es eine Möglichkeit, ich kann ein C++ Objekt/Funktion zu JavaScript im QtWebKit-Browser in Qt offen legen? Es ist möglich, ActionScript-Objekte JS-Code zur Verfügung zu stellen, der im WebKit-Browser in Adobe AIR ausgeführt wird - ich suche nach ähnlichen Funktionen in Qt.Expose C++ Objekt zu Javascript in Qt

Antwort

2

Ja. Werfen Sie einen Blick auf this. Es sollte ein guter Anfang sein.

+0

Danke für die Info! – BlueSilver

4

EDIT: LINK funktioniert, aber nur für den Fall zu Verbindungsabbrüchen WIEDER [Link] von Richard Moore ...

Eine Frage, die ich habe mehrmals kommen gesehen auf #qt und qt-Interesse ist wie zu benutzerdefinierte (anwendungsspezifische) APIs zu den standardmäßig verfügbaren in QtWebKit hinzufügen. Dies ist eigentlich ziemlich einfach (sobald Sie wissen, wie), wie ich unten zeigen werde. Dieser Beitrag zeigt ein einfaches Beispiel, wie man ein Objekt von JavaScript aus zugänglich macht, einschließlich Aufrufmethoden für das Objekt und Rückgabewerte von C++.

Es gibt zwei Dinge, die Sie wirklich brauchen, um zu wissen, diese Integration durchzuführen, wobei die erste die addToJavaScriptWindowObject() -Methode von QWebFrame ist, ermöglicht dies die angegebene QObject sichtbar von Javascript machen. Die zweite Sache, die Sie wissen müssen, ist, dass Objekte, die in auf diese Weise veröffentlicht werden, jedes Mal verschwinden, wenn das Javascript-Fensterobjekt gelöscht wird - dh. Jedes Mal, wenn der Benutzer zu einer neuen Seite navigiert. Um zu verhindern, dass dies zu Problemen führt, gibt QWebFrame ein Signal aus, das Ihnen mitteilt, wenn das Objekt gelöscht ist und Sie Ihre benutzerdefinierte API erneut hinzufügen können. Das ist eigentlich viel einfacher als es klingt!

Der Kern dieser wirklich in zwei Verfahren im Beispiel implementiert ist, sind sie unten gezeigt:

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

alle Dieser Code ist, die Sie benötigen, um alle die zu machen Öffentliche Slots des MyApi-Objekts, das für JavaScript sichtbar ist. Die MyApi Klasse bietet zwei öffentliche Slots: (! Ja, Slots können die Dinge zurückkehren)

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

Der erste Schlitz meldet einfach eine Nachricht an den Debug-Ausgabe, die zweite kehrt die Summe seiner beiden Argumente . Sie sind von Javascript wie folgt aufgerufen:

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

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

Und das ist alles, was es ist! Sie können den Code von>http://xmelegance.org/devel/qtwebkitextension.tar.gz herunterladen.

+0

Dieses Beispiel ist in QT5 leider nicht funktionsfähig. Irgendeine Chance für ein Update oder soll ich eine andere Frage öffnen? – Alex

Verwandte Themen