[英]How to use QML QtWebView to call C++?
在Qt 5.5中,使用他們提供的Minibrowser示例 ,它使用了與QWebView小部件不同的東西。 相反,它使用QML和QtWebView模塊 。 當您查看Javascript的navigator.appVersion
,它會告訴您QWebView加載了自定義AppleWebKit / 538.1(Qt5.5附帶的東西),而QtWebView(請注意區別)加載了本機核心操作系統AppleWebKit / 601.1.56。 確認這一點是因為當我在OSX(El Capitan版本)上加載Safari時顯示601.1.56。
但是,問題是,我的Minibrowser中的Javascript函數如何在后端調用C ++函數來執行更強大的任務? 當我使用QWebView小部件時,我能夠使用C ++ Webkit橋 , 該橋使我可以將C ++對象注入DOM,從而可以調用我的C ++代碼。 我沒有看到任何記錄有關使用QtWebView的基於QML的Minibrowser示例如何執行此操作的技術。 有什么技巧?
編輯:哦,並且要澄清一下,我不是通過Web服務器用它來調用遠程網頁。 我只是通過file://調用東西。 換句話說,我正在使用豐富的Webkit界面為我提供超強大的GUI,其功能遠遠超出Qt小部件和QML可以為我提供的功能。
我找到了答案。 基本上,在Qt5.5中,我將使用QtWebView進入實驗領域。 類方法在很大程度上是未記錄的,將來可能會更改。
目前,唯一的技術是消息傳遞,而不是像在QWebView C ++ Bridge中可以使用的本機C ++類方法調用。 QWebView C ++ Bridge僅適用於QWebView小部件,不適用於QtWebView QML。 因此,您可以通過navigator.qt.postMessage()
API將此消息從Javascript傳遞到QML,然后QML可以調用C ++。 為了獲得額外的功能,您需要執行一些步驟。 這是一個例子:
這是這里的一點博客:
http://rschroll.github.io/beru/2013/08/21/qtwebview.experimental.html
從示例中可以看到,您必須將這些導入添加到main.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(Qt 5.6、5.7 ?)時遷移到QtWebEngine 。
默認情況下,它會為您提供您可能不需要的右鍵單擊上下文菜單。 有趣的是,如果導入實驗庫,然后在QML中設置此屬性,則可以將其關閉: experimental.preferences.navigatorQtObjectEnabled: true
。
默認情況下,除非啟用了experimental.preferences.navigatorQtObjectEnabled: true
否則HTML5 postMessage()API(帶有HTML5的本機)似乎無法正常工作。
啟用experimental.preferences.navigatorQtObjectEnabled: true
,如果在某些HTML頁面元素上啟用了滾動條,則滾動條將消失,復選框和單選按鈕看起來非常時髦,並且彈出選擇列表框停止工作。
當您雙擊頁面時,它將對其進行縮放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.