2010-04-28 5 views
6

Я работаю с QWeb QWebView и нашел много полезных применений для добавления в объект окна webkit.Qt 4.6 Добавление объектов и под-объектов в объект окна QWebView (C++ и Javascript)

Одна вещь, которую я хотел бы сделать, это вложенные объекты ..., например:

в JavaScript, я могу ...

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

, очевидно, в большинстве случаев это будет сделано через более OO js-framework.

Это приводит к опрятной структуре:

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

Прямо сейчас я могу продлить объект окна со всеми QTC++ методы и сигналы, мне нужно, но все они имеют «кажутся» к должны быть в корневом дочернем элементе «окна». Это заставляет меня написать объект оболочки js, чтобы получить иерархию, которую я хочу в DOM.

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

Это довольно упрощенный пример ... Я хочу, чтобы объекты для параметров, и т.д. ...

Кто-нибудь знает, как передать объект ребенка с объектом, который расширяет WebFrame-х оконный объект?

Вот пример кода, как я добавляю объект:


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

пример.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> 

Я новичок в программировании на С ++ (исходя из веб-интерфейса и фона python).

Надеюсь, этот пример поможет не только помочь другим новым пользователям, но и станет чем-то интересным для более опытного программиста на C++.

Благодарим за любую помощь, которая может быть предоставлена.:)

ответ

2

Я была такая же проблема, и нашел ответ здесь: http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

Доступ Детские объекты QObject

Каждый назван потомком QObject (то есть, для которых QObject::objectName() не пустой строка) по умолчанию доступна как свойство объекта оболочки JavaScript. Например, если у вас есть QDialog с дочерним виджетом, чьё Objectname свойство «OK для подтверждения», вы можете получить доступ к этому объекту в коде сценария посредством выражения

myDialog.okButton 

С Objectname самого по себе является Q_PROPERTY, вы можете манипулировать имя в коде сценария, например, переименовать объект:

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

 Смежные вопросы

  • Нет связанных вопросов^_^