2010-04-28 11 views
6

Sto lavorando con QWeb di QWebView e ho trovato molti grandi usi per l'aggiunta all'oggetto della finestra del webkit.Qt 4.6 Aggiunta di oggetti e oggetti secondari all'oggetto della finestra QWebView (C++ e Javascript)

Una cosa che vorrei fare è oggetti nidificati ... per esempio:

in Javascript che posso ...

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

ovviamente nella maggior parte dei casi questo potrebbe essere fatto attraverso una più OO js-framework.

Questo si traduce in una struttura ordinata di:

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

In questo momento sono in grado di estendere l'oggetto finestra con tutti i ++ metodi e segnali ho bisogno QTc, ma tutti hanno 'sembrano' a deve essere in un figlio di root di "finestra". Questo mi costringe a scrivere un oggetto js wrapper per ottenere la gerarchia che voglio nel DOM.

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

Questo è un esempio abbastanza semplificata ... Voglio oggetti per i parametri, ecc ...

Qualcuno sa di un modo per passare un oggetto figlio con l'oggetto che estende il WebFrame del oggetto finestra?

Ecco qualche esempio di codice di come sto aggiungendo l'oggetto:


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> 

Sono ragionevolmente nuovo alla programmazione in C++ (proveniente da uno sfondo Web e Python).

Speriamo che questo esempio serva non solo ad aiutare altri nuovi utenti, ma sia qualcosa di interessante per un programmatore C++ più esperto su cui approfondire.

Grazie per l'assistenza che può essere fornita.:)

risposta

2

Ho avuto lo stesso problema, e hanno trovato una risposta qui: http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

Accesso Bambino QObject

Ogni bambino di nome del QObject (vale a dire, per i quali QObject::objectName() non è un vuoto string) è di default disponibile come una proprietà dell'oggetto wrapper JavaScript. Ad esempio, se si dispone di un QDialog con un widget bambino la cui objectName proprietà è "okButton", è possibile accedere a questo oggetto nel codice di script attraverso l'espressione

myDialog.okButton 

Dal objectName è di per sé un Q_PROPERTY, è possibile manipolare il nome nel codice dello script per, ad esempio, rinominare un oggetto:

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