С 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.
Я нашел ответ. По сути, в 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-страницы, флажки и переключатели выглядят необычно, и всплывающие списки выбора перестали работать.
Когда вы дважды щелкаете страницу, она увеличивает ее.
Других решений пока нет …