Я использую фреймворк QT WebEngine для отображения веб-страниц. Я ввожу javascript в страницу, когда она загружается, и хочу, чтобы javascript мог получить доступ к объекту QT. По-видимому, для этого должен существовать QWebChannel, который устанавливает некоторый IPC между хромом (javascript) и остальной частью моего проекта C++/QT. Я наткнулся на функцию QWebEnginePage::setWebChannel (QWebChannel *channel), однако не могу найти примеров ее использования. Документация (http://doc.qt.io/qt-5/qwebenginepage.html#setWebChannel) упоминает, что qt.webChannelTransport должен быть доступен в контексте javascript, но я не вижу, где это установлено в qwebchannel.js (https://github.com/qtproject/qtwebchannel/blob/dev/src/webchannel/qwebchannel.js). Я видел примеры WebChannel (http://doc.qt.io/qt-5/qtwebchannel-examples.html) и хотел бы по возможности избегать использования веб-сокетов.
Ниже показано, как я пытался реализовать веб-канал.
Каждый раз, когда загружается страница, я устанавливаю канал и вставляю javascript на C++:
QWebChannel *channel = new QWebChannel();
channel->registerObject(QStringLiteral("jshelper"), helper);
view->page()->runJavaScript(qwebjs); //this is qwebchannel.js
view->page()->setWebChannel(channel);
view->page()->runJavaScript(myfunction); //function that calls QT object (jshelper)
В Javascript:
new QWebChannel(qt.webChannelTransport, function(channel) { ... });
Это приводит к тому, что канал не подключается должным образом (при условии, что это из-за qt.webChannelTransport, поскольку он работал, когда я использовал WebSockets). Любые указатели на примеры настройки QWebChannel с помощью QWebEnginePage также приветствуются.