Как использовать QML QtWebView для вызова C ++?

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

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

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

0

Решение

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

Пока единственная техника — это передача сообщений, а не вызов метода класса C ++, который вы могли бы использовать в QWebView C ++ Bridge. QWebView C ++ Bridge работает только с виджетами QWebView, но не с QtWebView QML. Итак, вы делаете это сообщение, передавая с navigator.qt.postMessage() API от вашего Javascript до вашего QML, а затем QML может вызывать C ++. Для того, чтобы получить эту дополнительную функциональность, вам нужно сделать несколько шагов. Вот пример:

Вызвать метод C ++ из веб-обозрения Javascript

Это в блоге немного здесь:

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, а затем перейти на QtWebEngine когда выйдет следующая версия Qt (Qt 5.6, 5.7?).

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

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

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

  • Когда вы дважды щелкаете страницу, она увеличивает ее.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]