2010-04-28 12 views
6

Estoy trabajando con QWebView de Qt, y he encontrado muchos usos geniales para agregar al objeto de la ventana de webkit.Qt 4.6 Agregar objetos y subobjetos al objeto de la ventana QWebView (C++ y Javascript)

Una cosa que me gustaría hacer es objetos anidados ... por ejemplo:

en Javascript que pueda ...

var api = new Object; 
api.os = new Object; 
api.os.foo = function(){} 
api.window = new Object(); 
api.window.bar = function(){} 

, obviamente, en la mayoría de los casos esto se llevaría a cabo a través de una mayor OO js-framework.

Esto se traduce en una estructura ordenada de:

>>>api 
------------------------------------------------------- 
    - api    Object {os=Object, more... } 
    - os    Object {} 
      foo   function() 
    - win    Object {} 
      bar   function() 
------------------------------------------------------- 

En este momento soy capaz de ampliar el objeto de la ventana con todos los QTC++ métodos y señales que necesito, pero todos ellos tienen 'parecer' a tiene que estar en un hijo raíz de "ventana". Esto me obliga a escribir un objeto js wrapper para obtener la jerarquía que quiero en el DOM.

>>>api 
------------------------------------------------------- 
    - api    Object {os=function, more... } 
    - os_foo   function() 
    - win_bar   function() 
------------------------------------------------------- 

Este es un ejemplo muy simplificado ... Quiero objetos de parámetros, etc ...

¿Alguien sabe de una manera de pasar un objeto hijo con el objeto que se extiende la WebFrame de objeto de ventana?

Aquí hay un código de ejemplo de la forma en que estoy añadiendo el objeto:


mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QtGui/QMainWindow> 
#include <QWebFrame> 
#include "mainwindow.h" 
#include "happyapi.h" 

class QWebView; 
class QWebFrame; 
QT_BEGIN_NAMESPACE 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    MainWindow(QWidget *parent = 0); 

private slots: 
    void attachWindowObject(); 
    void bluesBros(); 

private: 
    QWebView *view; 
    HappyApi *api; 
    QWebFrame *frame; 

}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include <QDebug> 
#include <QtGui> 
#include <QWebView> 
#include <QWebPage> 

#include "mainwindow.h" 
#include "happyapi.h" 

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    view = new QWebView(this); 
    view->load(QUrl("file:///Q:/example.htm")); 

    api = new HappyApi(this); 

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

    attachWindowObject(); 

    connect(frame, 
      SIGNAL(javaScriptWindowObjectCleared()), 
     this, SLOT(attachWindowObject())); 

    connect(api, 
      SIGNAL(win_bar()), 
     this, SLOT(bluesBros())); 

    setCentralWidget(view); 
}; 

void MainWindow::attachWindowObject() 
{ 
     frame->addToJavaScriptWindowObject(QString("api"), api); 
}; 

void MainWindow::bluesBros() 
{ 
     qDebug() << "foo and bar are getting the band back together!"; 
}; 

happyapi.h

#ifndef HAPPYAPI_H 
#define HAPPYAPI_H 

#include <QObject> 

class HappyApi : public QObject 
{ 
     Q_OBJECT 

public: 
     HappyApi(QObject *parent); 

public slots: 
     void os_foo(); 

signals: 
     void win_bar(); 

}; 

#endif // HAPPYAPI_H 

happyapi.cpp

#include <QDebug> 

#include "happyapi.h" 

HappyApi::HappyApi(QObject *parent) : 
     QObject(parent) 
{ 

}; 

void HappyApi::os_foo() 
{ 
     qDebug() << "foo called, it want's it's bar back"; 
}; 

example.htm

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8" /> 
<title>Stackoverflow Question</title> 
<script type='text/javascript' 
    src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> 
</head> 

<body> 
<button type="button" onclick="api.os_foo()">Foo</button> 
<button type="button" onclick="api.win_bar()">Bar</button> 
</body> 
</html> 

Soy bastante nuevo en la programación C++ (proveniente de un fondo web y python).

Afortunadamente, este ejemplo servirá no solo para ayudar a otros usuarios nuevos, sino también como algo interesante para un programador C++ más experimentado.

Gracias por cualquier ayuda que pueda ser proporcionada.:)

Respuesta

2

que tenían el mismo problema, y ​​se encontró una respuesta aquí: http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

Acceso QObjects Niño

Cada niño con nombre de la QObject (es decir, para los que QObject::objectName() no es un vacío cadena) está disponible por defecto como una propiedad del objeto contenedor de JavaScript. Por ejemplo, si tiene un QDialog con un widget niño cuya nomObjeto propiedad es "okButton", se puede acceder a este objeto en código de secuencia de comandos a través de la expresión

myDialog.okButton 

Desde nomObjeto es en sí mismo un Q_PROPERTY, se puede manipular el nombre en código de script para, por ejemplo, cambiar el nombre de un objeto:

myDialog.okButton 
myDialog.okButton.objectName = "cancelButton"; 
// from now on, myDialog.cancelButton references the button 
Cuestiones relacionadas