2010-04-26 16 views
6

¿Hay alguna manera de exponer un objeto/función C++ a JavaScript ejecutándose dentro del buscador QtWebKit en Qt? Es posible exponer objetos de ActionScript al código JS que se ejecuta dentro del navegador WebKit en Adobe AIR. Estoy buscando una funcionalidad similar en Qt.Exponer el objeto C++ a Javascript en Qt

Respuesta

2

Sí. Eche un vistazo a this.. Debe ser un buen comienzo.

+0

¡Gracias por la información! – BlueSilver

4

EDIT: enlace funciona, pero sólo en caso ROMPE EL ENLACE DE NUEVO [Link] por Richard Moore ...

Una pregunta que he visto llegar varias veces en qts y QT-interés es cómo agregar API personalizadas (específicas de la aplicación) a las disponibles por defecto en QtWebKit. Esto es bastante fácil (una vez que sepa cómo) como mostraré a continuación . Esta publicación mostrará un ejemplo simple de cómo hacer que un objeto esté disponible desde javascript, incluidos los métodos de llamada en el objeto y los valores de devolución de C++.

Hay dos cosas que realmente necesita saber con el fin de realizar esta integración , el primero es el método addToJavaScriptWindowObject() de QWebFrame, esto permite que hará que el QObject especificada visible desde Javascript. Lo segundo que necesita saber es que los objetos publicados en de esta manera desaparecerán cada vez que se borre el objeto de la ventana javascript - , es decir. cada vez que el usuario navega a una nueva página. Para evitar que esto cause problemas con , QWebFrame proporciona una señal que le informa cuando el objeto está desactivado , lo que le permite volver a agregar su API personalizada. ¡De hecho, es mucho más simple de lo que parece!

El núcleo de este es realmente implementado en dos métodos en el ejemplo, son muestra a continuación:

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

Este código es todo lo que necesita con el fin de hacer toda la ranuras públicas del objeto MyApi visible para JavaScript. La clase MyApi proporciona dos ranuras pública: (! Sí, ranuras pueden volver las cosas)

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

la primera ranura simplemente registra un mensaje en la salida de depuración, el segundo vuelve la suma de sus dos argumentos . Se llaman desde JavaScript como esto:

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

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

Y eso es todo lo que hay que hacer! Puede descargar el código desde>http://xmelegance.org/devel/qtwebkitextension.tar.gz.

+0

Desafortunadamente, este ejemplo no funciona en QT5. ¿Alguna posibilidad de una actualización o debo abrir otra pregunta? – Alex

Cuestiones relacionadas