Qt Webkit Bridge: доступ C++ к JavaScript

Я использую QWebView и вызываю setHtml() для отображения некоторых страниц HTML/JavaScript. Я передаю обновления данных с помощью QWebFrame::evaluateJavaScript, передавая ему QString, содержащую вызов функции JavaScript (с аргументами). Прочитав о мосте Qt WebKit, я чувствую, что должен быть лучший способ сделать это. Я вижу обсуждение раскрытия объектов/функций Qt в C++ для JavaScript, но не в другом направлении. (Я не хочу, чтобы JavaScript опрашивал сторону C++ на наличие обновлений.) Есть ли способ подключить функцию JavaScript в качестве слота к сигналу Qt/C++? (Или аналогичный шаблон) Мне кажется, что я просмотрел множество документов, разместил вопросы (даже «Похожие вопросы», когда я это печатаю), но не видел примеров этого. Цените любую информацию, ссылки или подталкивания в правильном направлении.


person jmc    schedule 07.04.2013    source источник
comment
что конкретно вы пытаетесь сделать? push из C++ ›› JS или наоборот?   -  person amwinter    schedule 18.05.2013


Ответы (1)


Используйте объект addToJavaScriptWindow для предоставления ваших объектов C++ уровня Javascript:

page()->mainFrame()->addToJavaScriptWindowObject(QString("myObject"), myObject);

Ознакомьтесь с документацией здесь: http://qt-project.org/doc/qt-4.8/qwebframe.html#addToJavaScriptWindowObject

Это покажет ваш С++ myObject как «myObject».

Затем вы можете сделать именно то, что ищете в своем сообщении, предположим, что myObject объявляет сигнал следующим образом:

сигнал:

mySignal(QString aParameter);

вы можете просто подключить этот сигнал к слоту на вашей веб-странице следующим образом:

myObject.mySignal.connect(это, это.mySignalSlot);

В этом случае mySignalSlot должен иметь ту же сигнатуру, что и объявление mySignal на стороне класса C++ (ну, «та же сигнатура» будет означать такое же количество параметров, поскольку javascript не типизирован, поэтому вам не нужно объявлять тип для каждого из их).

Что действительно полезно здесь, так это передавать объекты JSon. Если вам нужно передать большое количество данных, вы можете использовать кодировку base64. Для изображений QTWebKit изначально поддерживает классы QImage и QPixmap; эти последние два изначально закодированы как сложные объекты javascript движком QTWebKit Bridge.

person Community    schedule 23.10.2014