Я хочу получить доступ к QtObject с HTML-страницы, работающей в WebView — вызывать методы, свойства чтения/записи и т. д.
Насколько я понял, мне нужно установить соединение WebSockets между сторонами QML и HTML, а затем использовать его в качестве транспорта для WebChannel< /а>.
Не путайте WebView с WebEngineView — я знаю, как сделать это с WebEngineView, но мне нужно сделать это с WebView.
Итак, вот что у меня есть.
Сторона QML
QtObject {
id: someObject
WebChannel.id: "backend"
property string someProperty: “property value"
}
WebSocketServer {
listen: true
port: 55222
onClientConnected: {
console.log(webSocket.status);
//webSocket.onTextMessageReceived.connect(function(message) {
// console.log(qsTr("Server received message: %1").arg(message));
//});
}
}
WebView {
url: "index.html"
//webChannel: channel // invalid property name "webChannel"
//experimental.webChannel.registeredObjects: [someObject] // invalid property name "experimental"
}
WebChannel {
id: channel
registeredObjects: [someObject]
}
HTML-сторона
window.onload = function()
{
// here will be QtObject from QML side
var backend;
var socket = new WebSocket("ws://localhost:55222");
socket.onopen = function()
{
//socket.send("some message");
new QWebChannel(socket, function(channel) {
backend = channel.objects.backend;
});
};
}
function alertProperty()
{
alert(backend.someProperty);
}
Простой обмен сообщениями работает нормально (socket.send()
), поэтому с транспортом все в порядке, но как мне назначить WebChannel для WebView? С WebEngineView было просто, там есть свойство webChannel
(и даже нет необходимости использовать WebSockets), но в WebView ничего подобного нет. Я имею в виду, что что-то должно сообщить WebView, что WebChannel содержит мой QtObject, чтобы он был виден JS?
И если WebView не поддерживает WebChannel(?), то как это сделать с помощью внешнего браузера? Этот пример показывает, что это возможно с C++, но я хочу сделать это с QML.
Я использую Qt 5.11.1.