Как отправить функцию JavaScript в C ++ и вызвать ее позже - PullRequest
0 голосов
/ 26 марта 2012

Мне нужно переопределить фреймворк JavaScript, используя QWebKit. В настоящее время я успешно вызываю методы C ++ из JavaScript, но теперь мне нужно зарегистрировать обратный вызов JavaScript и иметь возможность вызывать его из C ++.

В исходной системе (созданной с использованием WebkitGTK) я построил функцию C, которая получила объект в качестве параметра. Этот объект был функцией JavaScript, которая должна быть вызвана как обратный вызов. Пример:

bool cb_function(param1, param2) {

   alert("This is the callback, called with "+param1);

}

my_c_class.set_callback(cb_function);

Здесь я определяю обратный вызов * cb_function * и отправляю его в базовую структуру. Затем в C я использовал JSObjectCallAsFunction () для вызова функции JavaScript всякий раз, когда мне нужно, отправляя ей некоторые параметры.

Мне нужно знать, как это сделать с помощью QtWebKit. Я предполагаю, что первая часть должна использовать метод Q_INVOKABLE (в данном случае вызываемый * set_callback *), который получает параметр QObject или QVariant. Это правильно?

А теперь вторая часть: как я могу вызвать из C ++ функцию, хранящуюся в этом QObject или QVariant?

Спасибо !!!

1 Ответ

0 голосов
/ 28 мая 2012

Вы не можете действительно передать функцию в C ++, и вы не можете напрямую вызвать функцию JavaScript из C ++.Тем не менее, то, что вы хотите, достижимо несколькими способами:

Одна вещь, которую вы можете сделать, это «подключить» функцию JS к одному из сигналов QObject (фактически сделать это слотом - если вы используетек терминологии сигнал / слот Qt), а затем испускает этот сигнал из C ++, который будет запускать (эффективно «вызывать») функцию JS - и при необходимости передавать ее значения в качестве аргументов.

Другой (менее удивительный) способ заключается в использовании метода QWebFrame «valuJavaScript »для оценки строки, вызывающей функцию, из контекста JS - при условии, что это функция в глобальной области видимости, и вы знаете имяЭто.Предположительно, вы можете передать его имя методу C ++, например, описанному вами «set_callback», а затем передать эту строку методу оценки, о котором я упоминал ранее.

...