2011-08-21 91 views
3

我已經開始深入研究C++和Qt,並且一直在使用WebKit Javascript/Qt綁定。我有所有的移動部分工作,除了我的QObject子類在Javascript方面是「未定義」的。下面是我遇到的麻煩簡單的測試程序:QWebFrame addToJavaScriptWindowObject()對象在Javascript中未定義

我的主窗口中執行:

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
ui->setupUi(this); 

// instantiate a webview 
QWebView *webview = new QWebView(this); 
webview->setGeometry(0, 0, 400, 300); 
webview->setUrl(QUrl("file://localhost/Users/kyle/Sites/tests/qt/index.html")); 

// instantiate and attach our QObject 
hello *h = new hello(); 

QWebFrame *frame = webview->page()->mainFrame(); 
frame->addToJavaScriptWindowObject("Hello", h); 

// show the window 
webview->show(); 
} 

HELLO.CPP

...snip... 

QString hello::say() 
{ 
    return QString("Kyle"); 
} 

Hello.h

...snip includes... 

class hello : public QObject 
{ 
    Q_OBJECT 

public: 
    hello(); 
    Q_INVOKABLE QString say(); 

}; 

以上這個index.html文件做了一個簡單的alert(Hello.say())調用,但是做了typeof Hello ,我弄不明白。我對C++有點生疏,對Qt也很新穎,所以我確信這是一個noob錯誤,但我很難過。

回答

0

這樣做的核心是真正的兩種方法,如下所示 實現:

void MyApi::setWebView(QWebView *view) 
{ 
    QWebPage *page = view->page(); 
    frame = page->mainFrame(); 

    attachObject(); 
    connect(frame, &QWebFrame::javaScriptWindowObjectCleared, this, &MyApi::attachObject); 
    // old approach 
    //connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject())); 
} 

void MyApi::attachObject() 
{ 
    frame->addToJavaScriptWindowObject(QString("MyApi"), this); 
} 

此代碼是所有你需要爲了使所有的 MyApi的公有槽的對象可見到JavaScript。該MyApi類提供了兩個公共插槽:(!是的,插槽可以返回的東西)

public slots: 
    void doSomething(const QString &param); 
    int doSums(int a, int b); 

第一個插槽只是消息記錄到調試輸出,第二個返回 它的兩個參數的總和。他們被稱爲 從JavaScript這樣的:

MyApi.doSomething('Hello from JS page 2!!!!'); 

sum = MyApi.doSums(2, 3); 
alert('C++ says the sum is ' + sum); 

上面的代碼是在QT5.5測試,請注意所有的方法應放在「公共插槽」一節。

+0

您的'attachObject()'公共槽類方法缺少'frame'對象。我通過執行'QWebFrame * frame = ui-> myWebViewWidget-> page() - > mainFrame();'來修復它。除此之外,這正是爲我工作的。 – Volomike

+0

這非常適合將我的對象注入到QWebView小部件的mainFrame()中,但似乎無法將其注入到子IFRAME中。你會嘗試什麼? http://stackoverflow.com/q/33599474/105539 – Volomike