2015-11-20 84 views
0

使用Qt 5.5,使用它們提供的Minibrowser example,它使用與QWebView widget不同的東西。相反,它使用QML和QtWebView module。當你看看Javascript的navigator.appVersion時,它讓你知道QWebView加載一個自定義的AppleWebKit/538.1(Qt5.5附帶的東西),而QtWebView(注意不同)加載本機核心操作系統AppleWebKit/601.1.56。這被證實是因爲當我在我的OSX(El Capitan版本)上加載Safari時,它說601.1.56。如何使用QML QtWebView來調用C++?

但問題是,我的Minibrowser中的Javascript函數如何在後端調用C++函數來執行更強大的功能?當我使用QWebView小部件時,我能夠使用C++ webkit bridge,它允許我將DOM注入到C++對象中,因此可以調用我的C++代碼。我沒有看到任何有關如何使用QtWebView的基於QML的Minibrowser示例進行記錄的技術。什麼技術?

編輯:哦,並澄清,我不打電話遠程網頁與此,通過網絡服務器。我只是通過file://來調用東西。換句話說,我使用了豐富的webkit界面,爲我提供了一個超強大的圖形用戶界面,超越了Qt窗口小部件和QML可以提供給我的東西。

回答

0

我找到了答案。基本上,在Qt5.5中,我正在用QtWebView潛入實驗用地。班級方法在很大程度上是無證的,將來可能會改變。

現在,唯一的技術是消息傳遞,而不是像在QWebView C++ Bridge中可以使用的本機C++類方法調用。 QWebView C++ Bridge僅適用於QWebView小部件,而不適用於QtWebView QML。所以,你將這個消息傳遞給navigator.qt.postMessage() API從你的Javascript到你的QML,然後QML可以調用C++。爲了獲得額外的功能,您需要執行幾個步驟。這裏有一個例子:

Invoke C++ method from webviews Javascript

這是博客這裏一點:

http://rschroll.github.io/beru/2013/08/21/qtwebview.experimental.html

正如你看到的例子,你要這些進口添加到您的主。QML:

import QtWebKit 3.0 
import QtWebKit.experimental 1.0 

然後,在你WebView{}部分,你必須加入這一行:

experimental.preferences.navigatorQtObjectEnabled: true 

在這一點上,你可以打電話navigator.qt.postMessage("call foo in C++");將消息發送給QML,你可以再拿起你的WebView{}節裏面:

experimental.onMessageReceived: { ...do something here in the QML... } 

你的QML則可以傳遞一個消息馬上回的Javascript:

experimental.postMessage("okay, I called foo in C++") 

然後在你的Javascript,你可以添加一個事件監聽器,如下:

navigator.qt.onmessage = function(ev) { 

    $('BODY').prepend(ev.data); // since console.log() is not possible 

} 

至於如何讓你的QML調用C++,這裏有一個例子:

https://stackoverflow.com/a/17881019/105539

編輯:在Qt 5.5中進行了更多的QtWebView實驗後,它在以下幾個方面顯得相當脆弱。 我不推薦在5.5中使用它 - 它尚未準備好用於黃金時段。在Qt 5.5中,現在最好使用QWebView小部件,然後在下一個版本的Qt發佈時遷移到QtWebEngine(Qt 5.6,5.7?)。

  • 默認情況下,它會給你一個你可能不想要的右鍵快捷菜單。有趣的是,如果您導入實驗庫,然後在QML中設置此屬性,則可以將其關閉:experimental.preferences.navigatorQtObjectEnabled: true

  • 默認情況下,除非啓用experimental.preferences.navigatorQtObjectEnabled: true,否則默認情況下,HTML5 postMessage()API(原生HTML5)不起作用。

  • 啓用experimental.preferences.navigatorQtObjectEnabled: true,滾動條消失,如果你使他們在某些HTML頁面元素,複選框和單選按鈕看起來非常時髦,而且彈下選擇列表框停止工作。

  • 當你雙擊一個頁面時,它會放大它。

+0

@MrEricSir我想你可能會感到困惑。我指的是QtWebView記錄不好,而不是QWebView。 QtWebView隨附5.5,僅利用本機webkit API,僅在Android,iOS和OSX上發佈,但不支持Windows或Linux。另一方面,QWebView隨附5.5,但帶有一箇舊版(但仍然可用)的webkit版本。 – Volomike

+0

@MrEricSir另外,似乎5.5中的QtWebView還不能用 - 正如我在上面解釋的那樣,東西會中斷。所以,現在只能使用QWebView,它只能在5.5下工作,但不會超過5.5,然後再遷移到QtWebEngine。然而,關於QtWebEngine的壞消息是,它會使用Chromium而不是Webkit--這是一個胖的安裝 - 而且很可能不會讓你在Apple Store中獲得批准。 – Volomike

+0

我試過並失敗,錯誤消息:''QtWebKit.experimental「沒有安裝'。爲什麼發生這種情況?我在Windows上使用Qt 5.7.0。 –