我找到了答案。基本上,在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頁面元素,複選框和單選按鈕看起來非常時髦,而且彈下選擇列表框停止工作。
當你雙擊一個頁面時,它會放大它。
@MrEricSir我想你可能會感到困惑。我指的是QtWebView記錄不好,而不是QWebView。 QtWebView隨附5.5,僅利用本機webkit API,僅在Android,iOS和OSX上發佈,但不支持Windows或Linux。另一方面,QWebView隨附5.5,但帶有一箇舊版(但仍然可用)的webkit版本。 – Volomike
@MrEricSir另外,似乎5.5中的QtWebView還不能用 - 正如我在上面解釋的那樣,東西會中斷。所以,現在只能使用QWebView,它只能在5.5下工作,但不會超過5.5,然後再遷移到QtWebEngine。然而,關於QtWebEngine的壞消息是,它會使用Chromium而不是Webkit--這是一個胖的安裝 - 而且很可能不會讓你在Apple Store中獲得批准。 – Volomike
我試過並失敗,錯誤消息:''QtWebKit.experimental「沒有安裝'。爲什麼發生這種情況?我在Windows上使用Qt 5.7.0。 –