javascript qt qwebview slot

Qt QWEBview devolución de llamada de JavaScript



slot (4)

¿Cómo pasar una función "puntero" de JavaScript a una ranura?

en JavaScript:

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

y en Qt:

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

Necesito la función "f1" para que se active en el JavaScript de c ++, una vez que se realiza algún procesamiento. Además, no sé de antemano el nombre del puntero a la función.


Si bien no funcionaría en todos los casos, simplemente podría 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 + "()"); }


deberías poder ejecutar tu script usando el método QWebFrame :: evaluateJavaScript . Vea si un ejemplo a continuación podría funcionar para usted:

inicializando la vista web:

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

gestor de señal loadFinished:

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>

EvaluarJavaScript debe desencadenar un cuadro de mensaje de alerta y devolver QVariant con el resultado de la función f1.

espero que esto ayude, saludos


Podrías resolver esto de otra manera, usando señales Qt, de la siguiente manera:

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

En su archivo HTML, puede conectarse a esta señal, así:

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.


Tengo una solución de trabajo completa aquí - usando máquinas tragamonedas. 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 del archivo 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>