Как использовать 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-страницы, флажки и переключатели выглядят необычно, и всплывающие списки выбора перестали работать.

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

Другие вопросы по тегам