2012-03-26 3 views
0

Ich muss ein JavaScript-Framework mit QWebKit neu implementieren. Momentan war es mir erfolgreich, C++ - Methoden von JavaScript aus aufzurufen, aber jetzt muss ich einen JavaScript-Callback registrieren und ihn von C++ aus aufrufen können.So senden Sie eine JavaScript-Funktion an C++, und rufen Sie sie später

Im ursprünglichen System (erstellt mit WebkitGTK) habe ich eine C-Funktion erstellt, die ein Objekt als Parameter erhalten hat. Dieses Objekt war die JavaScript-Funktion, die als Callback aufgerufen werden sollte. Ein Beispiel:

bool cb_function(param1, param2) { 

    alert("This is the callback, called with "+param1); 

} 

my_c_class.set_callback(cb_function); 

Hier definiere ich die * cb_function * Rückruf, und an den zugrunde liegenden Rahmen senden. Dann habe ich in C mit JSObjectCallAsFunction() die JavaScript-Funktion immer dann aufgerufen, wenn ich dazu einige Parameter gesendet habe.

Was ich wissen muss, ist, wie dies mit QtWebKit stattdessen zu tun ist. Ich nehme an, dass der erste Teil eine Q_INVOKABLE-Methode (in diesem Fall * set_callback *) verwenden muss, die einen QObject- oder QVariant-Parameter empfängt. Ist das richtig?

Und nun der zweite Teil: Wie kann ich aus C++ die in diesem QObject oder QVariant gespeicherte Funktion aufrufen?

Danke !!!

Antwort

0

Sie können nicht wirklich die Funktion C++ übergeben, und Sie können nicht direkt Aufruf einer JavaScript-Funktion von C++. Was Sie wollen, ist jedoch auf mehrere Arten erreichbar:

Eine Sache, die Sie tun können, ist "verbinden" eine JS-Funktion mit einem der QObject-Signale (effektiv machen es zu einem Steckplatz - wenn Sie an die gewöhnt sind Qt-Signal/Slot-Terminologie) und dann dieses Signal von C++ ausstrahlen, welches die JS-Funktion auslösen (effektiv "aufrufen") - und optional Werte als Argumente übergeben wird. Die andere (weniger ehrfurchtgebietende) Methode besteht darin, die "evaluateJavaScript" -Methode von QWebFrame zu verwenden, um eine Zeichenfolge auszuwerten, die die Funktion aus dem JS-Kontext aufruft - vorausgesetzt, sie ist eine Funktion im globalen Gültigkeitsbereich und Sie kennen den Namen. Vermutlich könnten Sie seinen Namen an eine C++ - Methode wie den von Ihnen beschriebenen "set_callback" übergeben und diese Zeichenfolge dann an die zuvor erwähnte evaluate-Methode übergeben.