Как использовать Qt WebEngine и QWebChannel?

Я использую новый WebEngine, чтобы играть и учиться. Я пытаюсь найти некоторые аналогичные методы, найденные с помощью Qt WebKit: addToJavaScriptWindowObject()

Я обнаружил, что с помощью Qt WebEngine я должен использовать QWebChannel для регистрации функций в объекте окна Javascript. Если это правильно, это приводит меня к следующему вопросу.

Я установил Qt 5.4.0 на свой компьютер. Я заметил, что qwebchannel.js не найден в SDK, установленном на моем компьютере. Я нашел его в источнике Git.

Если у меня есть собственное настольное приложение Qt с QWebEnginePage и QWebEngineView, что мне нужно, чтобы иметь возможность регистрировать функции в объекте окна Javascript?

Мое настольное приложение автоматически переходит на созданную мной страницу http. Поэтому у меня есть доступ к содержимому, связанному с QWebEngineView.

Какие шаги следует предпринять, чтобы я мог сделать эту работу?

Ответ 1

В Qt5.6, если вы хотите, чтобы часть С++ и JavaScript были связаны, единственный способ сделать это - использовать QWebChannel на QWebEngineView, как вы заявили. Вы делаете это в файле .cpp:

m_pView = new QWebEngineView(this);
QWebChannel * channel = new QWebChannel(page);
m_pView->page()->setWebChannel(channel);
channel->registerObject(QString("TheNameOfTheObjectUsed"), this);

Здесь вы просто скажете, что вы зарегистрировали объект с именем TheNameOfTheObjectUsed, который будет доступен на стороне JS. Теперь это часть кода для использования в стороне JS:

new QWebChannel(qt.webChannelTransport, function (channel) {
            // now you retrieve your object
            var JSobject = channel.objects.TheNameOfTheObjectUsed;
        });

Теперь, если вы хотите получить некоторые свойства класса со стороны JS, вам нужно иметь метод на стороне С++, который возвращает строку, целое число и длину... Это то, на что похоже на стороне С++, в .h:

Q_INVOKABLE int getInt();
Q_PROPERTY(int myIntInCppSide READ getInt);

И теперь вы получаете int как на стороне JS:

var myIntInJSside= JSobject.myIntInCppSide;

Это очень простое объяснение, и я рекомендую вам смотреть это видео, что было очень полезно для меня. Кроме того, вы можете прочитать больше о JavaScript API, предоставленном QWebChannel, а также о документации QWebChannel.

Надеюсь, что это поможет!

Ответ 2

У Qt есть документация по этому поводу:

Автономный пример Qt WebChannel

Вам нужно добавить QWebSocketServer в ваше приложение cpp, которое QWebEngineView HTML/Javascript будет подключаться к использованию WebSocket. Затем используйте QWebChannel для двусторонней связи.