Как настроить 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
Источники: