2010-01-11 15 views
5

Me preguntaba si alguien sabe sobre buenos tutoriales o artículos que describan métodos para crear una GUI HTML para una aplicación que utiliza QTWebKit para una aplicación de escritorio de Windows.QtWebkit como una GUI de aplicación de escritorio

Estoy principalmente preocupado por la comunicación de mensajes, eventos e información entre digamos una DLL (escrita en C++ por ejemplo) y la GUI (QtWebKit).

necesitan buenas referencias fiables ...

Respuesta

4

Esto no será fácil: los navegadores Web son fortalezas debido a preocupaciones de seguridad. Por lo tanto, es bastante difícil pasar de JS en una página web a algo fuera del navegador.

Además, QtWebKit no es una API muy abierta. El mayor obstáculo en su caso es que no le ofrece acceso al DOM, por lo que solo puede reemplazar todo el HTML.

Por lo tanto, deberá parchar y escribir una gran cantidad de código para implementar las API y funciones que faltan.

Desde que se lanzó Qt 4.6, existe QWebElement (see the docs por ejemplos), por lo que al menos puede acceder al DOM y modificarlo. Eso hará que muchas cosas sean más simples. Sugiero que decida quién controla el navegador: ¿su aplicación será JavaScript que llame al exterior o la aplicación esté realmente en C++ y use el navegador como un procesador inteligente de interfaz de usuario?

Una forma mucho más simple podría ser hacer que su idea funcione sería iniciar un servidor web interno cuando se inicia su aplicación y luego abrir una vista de QtWebKit apuntando a la URL del servidor local. Entonces, podría usar todas las herramientas estándar de desarrollo web. Eclipse usa esta técnica para su sistema de ayuda interno.

+2

doeesn't QWebElement y QWebElementSelection dan acceso a la manipulación de elementos DOM? –

+0

Lo hace ........ –

+0

No sabía que Qt 4.6 ya había sido lanzado. Tienes razón, mira este enlace: http://doc.trolltech.com/4.6/qt4-6-intro.html#dom-access-api –

2

Para el uso básico, el examples de Trolltech debe empezar.

El lado positivo del enfoque de Qt es que exponer objetos a la secuencia de comandos es relativamente fácil, ver p. here. JavaScript en los diferentes webkits integrados puede comunicarse fácilmente con C++ (y, por supuesto, con el script en otras ventanas si proporciona soporte en el lado de C++ para eso). La desventaja es que la API no parece ser bastante estable todavía y parece que falta soporte para agregar detectores de eventos desde JavaScript a objetos C++ (o al menos no vi cómo se suponía que debía hacerse).

La colocación de elementos personalizados dibujados en la página es bastante simplificada, inserta complementos en la página (por ejemplo, a través de la etiqueta <object>) y devuelve QWidgets personalizados desde QWebPluginFactory::create().

Lo importante a tener siempre en cuenta: las llamadas al webkit incorporado (por ejemplo, para evaluar JavaScript) siempre deben aparecer en el hilo principal.

+0

Gracias por un comentario profundo. ¿Puede proporcionar más información sobre por qué "las llamadas al webkit incorporado (por ejemplo, para evaluar JavaScript) siempre deben aparecer en el hilo principal"? – EightyEight

+0

En cualquier navegador actual, sé que el motor de script reside en el hilo principal y no es seguro para subprocesos. El desarrollador de plugins debe asegurarse de que las llamadas al navegador se emitan desde el hilo correcto, a menos que algunas funciones de API ya se ocupen de eso; si no lo hace, obtendrá un comportamiento indefinido y probablemente bloqueos. –

3

Estoy copiando/pegando bits de diferentes secciones, pero así es como inserto un objeto que está disponible para javascript, luego uso javascript para hablar con la aplicación principal. Parece que funciona bien ...

void MyApi::setWebView(QWebView *view) { 

    QWebPage *page = view->page(); 
    m_frame = page->mainFrame(); 

    attachObject(); 
    connect(m_frame, SIGNAL(javaScriptWindowObjectCleared()), 
     this, SLOT(attachObject())); 

} 

void MyApi::attachObject() { 

    m_frame->addToJavaScriptWindowObject(QString("MyApi"), this); 

} 

Esto hace que un objeto MyApi existen en JavaScript y puedo llamar a cualquiera de las ranuras puestos a disposición de la clase MyApi.

Cuestiones relacionadas