Qt WebChannel JavaScript API
Настройка JavaScript API
Для связи с QWebChannel или WebChannel, клиент должен использовать и настроить JavaScript API, предоставляемый qwebchannel.js. Для клиентов, работающих внутри Qt WebEngine, вы можете загрузить файл через %%%NON_TRANSLABLE_1%%%. Для внешних клиентов вам нужно скопировать файл на ваш веб-сервер. Затем необходимо создать объект QWebChannel и передать ему объект транспорта и функцию обратного вызова, которая будет вызвана после завершения инициализации канала и доступности опубликованных объектов.
Объект транспорта реализует минимальный интерфейс передачи сообщений. Он должен быть объектом с функцией %%%NON_TRANSLABLE_2%%%, которая принимает строковое JSON-сообщение и передает его объекту QWebChannelAbstractTransport на стороне сервера. Кроме того, его свойство %%%NON_TRANSLABLE_3%%% должно вызываться при получении сообщения от сервера. В качестве альтернативы, вы можете использовать WebSocket для реализации интерфейса.
Обратите внимание, что объект JavaScript QWebChannel должен быть создан после того, как объект транспорта будет полностью функциональным. В случае WebSocket, это означает, что вы должны создать QWebChannel в обработчике %%%NON_TRANSLABLE_4%%% сокета. Обратите внимание на пример Qt WebChannel Standalone Example https://doc.qt.io/qt-5.12/qtwebchannel-standalone-example.html, чтобы увидеть, как это делается.
Взаимодействие с QObjects
После вызова обратного вызова, переданного объекту QWebChannel, канал завершает инициализацию, и все опубликованные объекты становятся доступны клиенту HTML через свойство %%%NON_TRANSLABLE_5%%%. Таким образом, предположим, что объект был опубликован с идентификатором «foo», тогда мы можем взаимодействовать с ним, как показано в примере ниже. Обратите внимание, что вся коммуникация между клиентом HTML и сервером QML/C++ асинхронна. Свойства кешируются на стороне HTML. Кроме того, имейте в виду, что только типы данных QML/C++, которые могут быть преобразованы в JSON, будут правильно сериализованы/десериализованы и, следовательно, доступны клиентам HTML.
new QWebChannel(yourTransport, function(channel) {
// Connect to a signal:
channel.objects.foo.mySignal.connect(function() {
// This callback will be invoked whenever the signal is emitted on the C++/QML side.
console.log(arguments);
});
// To make the object known globally, assign it to the window object, i.e.:
window.foo = channel.objects.foo;
// Invoke a method:
foo.myMethod(arg1, arg2, function(returnValue) {
// This callback will be invoked when myMethod has a return value. Keep in mind that
// the communication is asynchronous, hence the need for this callback.
console.log(returnValue);
});
// Read a property value, which is cached on the client side:
console.log(foo.myProperty);
// Writing a property will instantly update the client side cache.
// The remote end will be notified about the change asynchronously
foo.myProperty = "Hello World!";
// To get notified about remote property changes,
// simply connect to the corresponding notify signal:
foo.onMyPropertyChanged.connect(function(newValue) {
console.log(newValue);
});
// One can also access enums that are marked with Q_ENUM:
console.log(foo.MyEnum.MyEnumerator);
});
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qtwebchannel-javascript.html