2010-04-28 3 views
6

Je travaille avec QWebView de Qt, et j'ai trouvé beaucoup d'utilisations pour ajouter à l'objet de fenêtre webkit.Qt 4.6 Ajout d'objets et de sous-objets à l'objet de fenêtre QWebView (C++ & Javascript)

Une chose que je voudrais faire est des objets imbriqués ... par exemple:

en Javascript que je peux ...

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

évidemment dans la plupart des cas, cela serait fait par un plus OO js-framework.

Il en résulte une structure bien rangé de:

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

En ce moment, je suis en mesure d'étendre l'objet de la fenêtre avec toutes les QTC++ méthodes et des signaux dont j'ai besoin, mais ils ont tous « semblent » à doivent être dans un enfant racine de "fenêtre". Cela me force à écrire un objet wrapper js pour obtenir la hiérarchie que je veux dans le DOM.

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

Ceci est un exemple assez simplifiée ... Je veux des objets pour les paramètres, etc ...

Est-ce que quelqu'un sait d'une façon de passer d'un objet enfant avec l'objet qui va de la Webframe objet de fenêtre?

Voici quelques exemples de code de la façon dont je suis l'objet d'ajouter:


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

exemple.htmJe suis relativement nouveau en programmation C++ (venant d'un arrière-plan web et python).

Espérons que cet exemple servira non seulement à aider d'autres nouveaux utilisateurs, mais soit quelque chose d'intéressant pour un programmeur C++ plus expérimenté à développer.

Merci pour toute assistance qui peut être fournie.:)

Répondre

2

J'ai eu le même problème, et trouvé une réponse ici: http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

Accès aux enfants QObjects

Chaque enfant nommé du QObject (qui est, pour ce qui est QObject::objectName() pas vide string) est disponible par défaut en tant que propriété de l'objet wrapper JavaScript. Par exemple, si vous avez un QDialog avec un widget enfant dont objectName propriété est « okButton », vous pouvez accéder à cet objet dans le code de script par l'expression

myDialog.okButton 

Depuis objectName lui-même est un Q_PROPERTY, vous pouvez manipuler le nom dans le code de script pour, par exemple, renommer un objet:

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