2015-11-20 1 views
0

С Qt 5.5, используя Minibrowser example, они обеспечивают, он использует что-то отличное от QWebView widget. Вместо этого он использует QML и QtWebView module. Когда вы смотрите в Javascript's navigator.appVersion, это позволяет вам узнать, что QWebView загружает пользовательский AppleWebKit/538.1 (вещь поставляется с Qt5.5), а QtWebView (обратите внимание на разницу) загружает собственную базовую ОС AppleWebKit/601.1.56. Это подтверждается тем, что когда я загружаю Safari на мой OSX (версия El Capitan), он говорит 601.1.56.Как использовать QML QtWebView для вызова C++?

Проблема, однако, в том, как моя функция Javascript в Minibrowser вызывает функции C++ на бэкэнд для создания более мощного материала? Когда я использовал виджет QWebView, я смог использовать C++ webkit bridge, который позволял мне вставлять в объект DOM my C++ и, следовательно, мог бы вызвать мой код на C++. Я не вижу какой-либо техники, задокументированной для того, как это сделать с примером Minibrowser на основе QML, который использует QtWebView. Какая техника?

EDIT: О, и для уточнения, я не звоню на удаленные веб-страницы с помощью этого веб-сервера. Я просто вызываю материал через файл: //. Другими словами, я использую богатый интерфейс webkit, чтобы дать мне супер мощный графический интерфейс, который выходит за рамки того, что Qt-виджеты и QML могут обеспечить для меня.

ответ

0

Я нашел ответ. В принципе, в Qt5.5 я погружаюсь в экспериментальную землю с QtWebView. Методы класса в основном недокументированы и могут измениться в будущем.

В настоящее время единственным методом является передача сообщений, а не вызов метода класса класса C++, как вы могли бы использовать в QWebView C++ Bridge. Мост QWebView C++ работает только с виджетами QWebView, а не с QtWebView QML. Итак, вы передаете это сообщение с API navigator.qt.postMessage() с вашего 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

EDIT: После дополнительных экспериментов в Qt 5.5 с QtWebView он выглядит довольно шелушащимся в следующих аспектах. Я не рекомендую его в 5.5 - он не готов к прайм-тайм. В Qt 5.5 вам лучше использовать виджет QWebView, а затем перейти на QtWebEngine, когда выйдет следующая версия Qt (Qt 5.6, 5.7?).

  • По умолчанию это дает контекстное меню rightclick, которое может вам не понадобиться. Интересно, что вы можете отключить его, если импортируете экспериментальную библиотеку, а затем установите это свойство в свой QML: experimental.preferences.navigatorQtObjectEnabled: true.

  • По умолчанию API HTML5 postMessage(), который является родным с HTML5, не работает, если вы не включили experimental.preferences.navigatorQtObjectEnabled: true.

  • Когда вы включите experimental.preferences.navigatorQtObjectEnabled: true, полосы прокрутки исчезнут, если вы включили их на некоторых элементах HTML-страницы, флажки и переключатели выглядят чрезвычайно напуганными, а всплывающие списки выбора перестают работать.

  • При двойном щелчке страницы она масштабирует ее.

+0

@MrEricSir Я думаю, вы можете быть смущены. Я имел в виду, что QtWebView плохо документирован, а не QWebView. QtWebView поставляется с 5.5 и использует только собственные API-интерфейсы webkit, которые поставляются только на Android, iOS и OSX, но не на Windows или Linux. QWebView, с другой стороны, поставляется с 5.5, но поставляется с более старой (но все еще пригодной для использования) версией webkit. – Volomike

+0

@MrEricSir Кроме того, похоже, что QtWebView в версии 5.5 просто еще не годный к употреблению - материал ломается, как я объясняю выше. Таким образом, на самом деле у нас нет выбора, кроме как использовать QWebView на данный момент, который будет работать только в 5.5, но не будет отправлен за 5.5, а затем перенесется в QtWebEngine позже. Однако плохая новость о QtWebEngine заключается в том, что она развертывается с Chromium вместо Webkit - с полной установкой - и, скорее всего, вы не получите одобрение в Apple Store. – Volomike

+0

Я пробовал и не смог с сообщением об ошибке: '' QtWebKit.experimental 'не установлен'. Почему это происходит? Я использую Qt 5.7.0 для Windows. –

Смежные вопросы