2010-04-28 96 views
6

我正在使用Qt的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框架。

這導致的一個整潔的結構:

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

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> 

我對C++編程(來自web和python背景)很合理。

希望這個例子不僅可以幫助其他新用戶,還可以成爲更有經驗的C++程序員進行闡述的一些有趣內容。

感謝您提供任何幫助。:)

回答

2

我有同樣的問題,在這裏找到了答案: http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

訪問兒童的QObject

QObject(即每命名的孩子,因爲這QObject::objectName()不是空字符串)默認可用作JavaScript包裝器對象的屬性。例如,如果你有一個子部件,其對象名屬性爲「okButton」一個QDialog的,您可以通過表達訪問腳本代碼這個對象

myDialog.okButton 

由於對象名本身就是一個Q_PROPERTY,你可以操縱名在腳本代碼中,例如,重命名對象:

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