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>