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