2010-04-26 48 views
6

有什麼方法可以將Qt中的QtWebKit瀏覽器中運行的JavaScript對象/函數暴露給JavaScript嗎?可以將ActionScript對象暴露給Adobe AIR中的WebKit瀏覽器內運行的JS代碼 - 我正在尋找Qt中的類似功能。在Qt中將C++對象暴露給Javascript

回答

2

是的。看看this.這應該是一個好的開始。

+0

感謝您的信息! – BlueSilver 2010-04-30 08:19:40

4

編輯:鏈接工作,但以防萬一鏈接由理查德·穆爾 AGAIN [Link]遊...

一個問題我見過拿出數倍於#qt和QT-興趣如何 將自定義(特定於應用程序)的API添加到默認情況下在 QtWebKit中可用的API。這實際上很簡單(一旦你知道如何),因爲我會在下面顯示 。這篇文章將展示一個簡單的例子,介紹如何從javascript創建一個對象 ,包括調用對象的方法並返回C++中的值 。

有你真的需要爲了執行這個 集成知道兩件事情,第一是 QWebFrame的addToJavaScriptWindowObject()方法,這允許將指定的QObject從 的JavaScript可見。您需要知道的第二件事是,以這種方式發佈在 中的對象每次清除javascript窗口對象時都會消失 - 即 即。每次用戶導航到新頁面時。爲了防止這種問題導致 問題,QWebFrame提供一個信號,告訴你何時清除對象 ,允許您重新添加自定義API。這實際上比起聽起來要簡單得多 !

這樣做的核心是在例如兩個方法真正落實,他們 如下圖所示:

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

    attachObject(); 
    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); 

而這一切就是這麼簡單!您可以從>http://xmelegance.org/devel/qtwebkitextension.tar.gz下載代碼。

+0

不幸的是,這個例子在QT5中不起作用。有任何更新的機會,或者我應該再打開一個問題嗎? – Alex 2015-05-11 20:41:36