Можно ли вызвать функцию C ++ из JavaScript в QWebView? - PullRequest
13 голосов
/ 08 марта 2012

У меня есть веб-страница, загруженная в QWebView.Там я хотел бы, чтобы JavaScript вызывал функцию моего приложения.Затем эта функция возвращает некоторые строки, которые JavaScript будет динамически отображать.

Можно ли это сделать с помощью QWebView?В принципе, возможно ли иметь какой-то мост между приложением (в C ++) и элементом управления QWebView?

1 Ответ

14 голосов
/ 11 марта 2012

Вот так я и сделал. Я объявил класс JavaScriptBridge в своем заголовочном файле с помощью метода Q_INVOKABLE. Q_INVOKABLE методы могут быть вызваны из JavaScript:

class DictionaryJavaScriptBridge : public QObject {

    Q_OBJECT

public:

    DictionaryJavaScriptBridge(DictionaryWidget* dictionaryWidget); 
    Q_INVOKABLE QStringList sentences(QString characters);

private:

    DictionaryWidget* dictionaryWidget_;

};

Затем в моем файле .cpp я создаю мост:

jsBridge_ = new DictionaryJavaScriptBridge(this);

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

connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(mainFrame_javaScriptWindowObjectCleared()));

Наконец, в слот javaScriptWindowObjectCleared я добавляю мост JavaScript:

void DictionaryWidget::mainFrame_javaScriptWindowObjectCleared() {
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ehbridge", jsBridge_);
}

Теперь из JavaScript будет открыт глобальный объект "ehbridge". Я могу вызывать его методы как обычный объект JavaScript (Qt преобразует типы Qt в типы JavaScript)

var sentences = ehbridge.sentences("test");
...