Как настроить QWebChannel JS API для использования в QWebEngineView?

Поскольку документация Qt далека от завершения, каковы способы настройки QWebChannel и есть ли какие-то отличия от добавления <script> тег на вашей странице HTML, как рекомендуется в документации?

1 ответ

Решение

Существуют разные варианты загрузки необходимого скрипта, доступного по URL qrc:///qtwebchannel/qwebchannel.js:

Обратите внимание:

  • Вы можете использовать этот URL только если вы просматриваете страницу из QWebEngineView. В противном случае вам может понадобиться загрузить файл API на ваш веб-сервер.

Предпосылки:

  • добавлять QT += webchannel на ваш .pro файл и запустить qmake

С помощью runJavaScript() выполнить код в QT QWebChannel JS API:

Мой предпочтительный метод, потому что кажется простым и надежным до сих пор. Имейте в виду возможность того, что API может не быть установлен к тому времени, когда этот код будет завершен как runJavaScript() Метод не блокирует текущий поток, пока не будет выполнен код JS.

QFile apiFile(":/qtwebchannel/qwebchannel.js"); //load the API from the resources
if(!apiFile.open(QIODevice::ReadOnly))
    qDebug()<<"Couldn't load Qt's QWebChannel API!";
QString apiScript = QString::fromLatin1(apiFile.readAll());
apiFile.close();
QWebEngineView view;    //your custom QWebEngineView
view.page().runJavaScript(apiScript);

С помощью runJavaScript() выполнить код для загрузки QS QWebChannel JS API:

Хотя я не пробовал эти методы, они все равно должны работать, так как они предназначены для загрузки внешних файлов JS. Один из предложенных здесь методов может пригодиться в зависимости от того, какие другие библиотеки вы используете.

Используя <script> тег на веб-странице:

Это метод по умолчанию, рекомендуемый документацией Qt. Он имеет преимущество в предоставлении API сразу после загрузки страницы. Недостатком этого является то, что вам нужно изменить HTML-код веб-страницы, что может быть болезненным, если вы не являетесь владельцем сайта.

Не забудьте создать объект QWebChannel на стороне C++:

QWebChannel* channel_ = new QWebChannel(view.page());
//attach it to the QWebEnginePage
view.page()->setWebChannel(channel_);
//register a QObject to be exposed to JavaScript
channel_->registerObject(QStringLiteral("jshelper"), this);

Этот ответ был задуман как дополнение к документации Qt, поэтому, если вы хотите что-то добавить, не стесняйтесь делать это.

Версия: Qt 5.6.1

Источники:

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