Как использовать QML QtWebView для вызова C++?
В Qt 5.5, используя предоставленный ими пример Minibrowser, он использует что-то отличное от виджета 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, я мог использовать мост Webkit C++, который позволял мне внедрять в DOM мой объект C++ и, следовательно, мог вызывать мой код C++. Я не вижу какой-либо методики, документированной для того, как сделать это с примером на основе QML Minibrowser, который использует QtWebView. Какая техника?
РЕДАКТИРОВАТЬ: Да, и, чтобы уточнить, я не вызываю удаленных веб-страниц с этим через веб-сервер. Я просто вызываю вещи через файл://. Другими словами, я использую богатый интерфейс webkit, чтобы дать мне очень мощный графический интерфейс, который выходит далеко за рамки того, что могут предоставить мне виджеты Qt и QML.
1 ответ
Я нашел ответ. По сути, в Qt5.5 я погружаюсь в экспериментальную страну с QtWebView. Методы класса в значительной степени недокументированы и могут измениться в будущем.
На данный момент единственная техника - это передача сообщений, а не собственный вызов метода класса C++, который вы могли бы использовать в мосте QWebView C++. 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++, вот пример:
/questions/34359912/kak-vyizvat-funktsiyu-c-iz-qml-i-izmenit-tekst-metki/34359919#34359919
РЕДАКТИРОВАТЬ: После дополнительных экспериментов в 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-страницы, флажки и переключатели выглядят необычно, и всплывающие списки выбора перестали работать.Когда вы дважды щелкаете страницу, она увеличивает ее.