2011-02-12 22 views
11

¿Cómo pasar una función "puntero" de JavaScript a una ranura?Qt QWEBview JavaScript de devolución de llamada

en JavaScript:

function f1() 
{ 
    alert("f1"); 
} 
qtclass.submit(f1); 

y en Qt:

public slots: 
    void submit(void * ptr) 
    { 
     (void)ptr; 
    } 

necesito el "F1", la función de ser despedido en el código JavaScript del C++, una vez algún tipo de procesamiento se lleva a cabo. Además, no sé de antemano el nombre del puntero a la función.

Respuesta

9

usted debe ser capaz de ejecutar la secuencia de comandos utilizando QWebFrame::evaluateJavaScript método. A ver si un ejemplo a continuación iba a funcionar para usted:

inicializar vistas web:

QWebView *view = new QWebView(this->centralWidget()); 
view->load(QUrl("file:///home//test.html")); 
connect(view, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); 

loadFinished manejador de la señal:

void MyTestWindow::loadFinished(bool) 
{ 
    QVariant f1result = ((QWebView*)sender())->page()->mainFrame()->evaluateJavaScript("f1('test param')"); 
    qDebug() << f1result.toString(); 
} 

test.html:

<head> 
    <script LANGUAGE="JavaScript"> 
     function f1 (s) 
     { 
      alert (s) 
      return "f1 result" 
     } 
    </script> 
</head> 
<body> 
    test html 
</body> 

evaluateJavaScript debe activar un cuadro de mensaje de alerta y devolver QVar gigante con el resultado de la función f1.

esperanza que esta ayuda, que se refiere a

3

Mientras que no funcionaría en todos los casos, usted podría simplemente pasar una cadena a su ranura. Su ranura podría usar evalúeJavaScript (como lo sugirió Serge) para llamar a la función.

function f1() 
{ 
    alert("f1"); 
} 
qtclass.submit("f1"); 

y en Qt:

public slots: 
    void submit(QString functionName) 
    { 
     m_pWebView->page()->mainFrame()->evaluateJavaScript(functionName + "()"); 
    } 
6

Se podría solucionar esto de otra manera, mediante el uso de señales de Qt, de la siguiente manera:

class qtclass 
{ 
    signals: 
     void done(QString message); 
}; 

En el archivo HTML se puede conectar a esta señal, como esta:

qtclass.done.connect(f1); 

function f1(message) 
{ 
    alert('f1 called from qtclass with message' + message); 
} 

Entonces tu clase C++ no necesita saber acerca de la función javascript.

+0

Estoy tratando de seguir su respuesta, y hacer lo mismo. Sin embargo, no funciona para mí. Aquí está mi pregunta: http://stackoverflow.com/questions/22037838/qt-qweb-callback-not-working-in-the-example-here. ¿Puedes por favor dedicar algo de tiempo para responder? –

+1

En código C++, ¿tenemos que emitir el hecho? –

+0

¿Te importaría responder a esta pregunta, http://stackoverflow.com/questions/22060192/why-callback-to-js-is-not-working-in-the-qtweb-using-signals-in-the-following- co –

1

Tengo aquí una solución de trabajo completa, usando ranuras. Sin embargo, no pude hacer que las señales funcionaran como sugirió Kurt.

#include <QtGui/QApplication> 
#include <QApplication> 
#include <QDebug> 
#include <QWebFrame> 
#include <QWebPage> 
#include <QWebView> 

class MyJavaScriptOperations : public QObject { 
    Q_OBJECT 
public: 
    QWebView *view; 
    MyJavaScriptOperations(); 

    Q_INVOKABLE qint32 MultOfNumbers(int a, int b) { 
     qDebug() << a * b; 
     return (a*b); 
    } 
public slots: 
    void callback(); 
public: 

void firecb(); 

signals: 
     void done(); 
}; 


MyJavaScriptOperations::MyJavaScriptOperations() 
{ 
    view = new QWebView(); 
    view->resize(400, 500); 

    connect(view->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(callback())); 

    view->load(QUrl("./shreyas.html")); 

    view->show(); 


    qDebug()<<view; 


} 

void MyJavaScriptOperations::callback() 
{ 
    qDebug()<<"Sending hello text"; 
    QString function = "f1()"; 
    view->page()->mainFrame()->addToJavaScriptWindowObject("myoperations", this); 
    view->page()->mainFrame()->evaluateJavaScript("f1()"); 
    done(); 
} 

void MyJavaScriptOperations::firecb() 
{ 
    qDebug()<<"Emitting Signal"; 
    done(); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 


    MyJavaScriptOperations *jvs = new MyJavaScriptOperations; 
    jvs->firecb(); 

    return a.exec(); 
} 
#include "main.moc" 

Los cambios en los archivos HTML son -

<head> 
    <script LANGUAGE="JavaScript"> 


function f1() 
{ 
    alert('f1 called from qtclass with message'); 
    document.write("HELLLLLLLLL"); 
} 
myoperations.callback(f1); 


function f2() 
{ 
    var result = myoperations.MultOfNumbers(3,7); 
    document.write(result); 
    alert('f1 called from qtclass with message'); 
} 


function f3() 
{ 

    alert('f3'); 
} 

myoperations.done.connect(f3); 


    </script> 
</head> 
<body> 
    test html 
<input type="button" value="click" onclick="f2()"> 
</body> 
Cuestiones relacionadas