2010-04-28 13 views
6

मैं क्यूटी के QWebView के साथ काम कर रहा हूँ, और वेबकिट विंडो ऑब्जेक्ट को जोड़ने के लिए महान का उपयोग करता है के बहुत सारे खोजने की है।क्यूटी 4.6 जोड़ना वस्तुओं और QWebView विंडो ऑब्जेक्ट को उप वस्तुओं (सी ++ और जावास्क्रिप्ट)

जावास्क्रिप्ट मैं यह कर सकते हैं में

...

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

जाहिर है ज्यादातर मामलों में यह एक और अधिक के माध्यम से किया जाएगा:

एक बात मैं करना चाहते हैं नेस्टेड वस्तुओं ... उदाहरण के लिए है ओओ जेएस-फ्रेमवर्क।

यह की एक साफ संरचना में जो परिणाम:

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

अभी मैं QTC++ तरीकों और संकेतों मैं जरूरत के सभी के साथ खिड़की वस्तु का विस्तार करने में सक्षम हूँ, लेकिन वे सभी के लिए 'लगते हैं' "खिड़की" के मूल बच्चे में होना चाहिए। यह मैं मजबूर कर रहा है एक js आवरण वस्तु लिखने के पदानुक्रम है कि मैं डोम में चाहते हैं।

>>>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++ प्रोग्रामर पर विस्तृत करने के लिए कुछ दिलचस्प होगा।

किसी भी सहायता की है कि प्रदान की जा सकती के लिए धन्यवाद।:)

उत्तर

2

मैं एक ही मुद्दा था, और यहाँ एक जवाब मिला: http://doc.qt.nokia.com/4.7/qtwebkit-bridge.html

तक पहुँचना बाल QObjects

QObject (कि है की हर नामित बच्चे, जिसके लिए QObject::objectName() एक खाली नहीं है स्ट्रिंग) डिफ़ॉल्ट रूप से जावास्क्रिप्ट रैपर ऑब्जेक्ट की संपत्ति के रूप में उपलब्ध है। उदाहरण के लिए, यदि आप एक बच्चे विजेट जिसका objectname संपत्ति "okButton" है के साथ एक QDialog है, तो आप स्क्रिप्ट कोड में इस वस्तु अभिव्यक्ति के माध्यम से उपयोग कर सकते हैं

myDialog.okButton 

के बाद से objectname अपने आप में एक Q_PROPERTY है, तो आप नाम में हेरफेर कर सकते हैं स्क्रिप्ट कोड में, उदाहरण के लिए, किसी ऑब्जेक्ट का नाम बदलें:

myDialog.okButton 
myDialog.okButton.objectName = "cancelButton"; 
// from now on, myDialog.cancelButton references the button 
संबंधित मुद्दे