Ответ 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");