Подтвердить что ты не робот

Можно ли вызвать функцию С++ из JavaScript в QWebView?

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

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

4b9b3361

Ответ 1

Вот как я это сделал. Я объявил класс 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");