簡體   English   中英

如何使用QML QtWebView調用C ++?

[英]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 ++。 為了獲得額外的功能,您需要執行一些步驟。 這是一個例子:

從Webviews Javascript調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM