This is how I ended up doing it. I declared a "JavaScriptBridge" class in my header file with a Q_INVOKABLE
method. Q_INVOKABLE
methods can be called from JavaScript:
class DictionaryJavaScriptBridge : public QObject {
Q_OBJECT
public:
DictionaryJavaScriptBridge(DictionaryWidget* dictionaryWidget);
Q_INVOKABLE QStringList sentences(QString characters);
private:
DictionaryWidget* dictionaryWidget_;
};
Then in my .cpp file, I create the bridge:
jsBridge_ = new DictionaryJavaScriptBridge(this);
And I listen to the javaScriptWindowObjectCleared
signal. This step is important because WebKit is going to clear all the JavaScript objects when loading a new page, so you need to add back the bridge every time:
connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(mainFrame_javaScriptWindowObjectCleared()));
Finally, in the javaScriptWindowObjectCleared
slot, I add the JavaScript bridge:
void DictionaryWidget::mainFrame_javaScriptWindowObjectCleared() {
ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ehbridge", jsBridge_);
}
Now from JavaScript, there will be a global "ehbridge" object exposed. I can call its methods like a normal JavaScript object (Qt converts Qt's types to JavaScript types)
var sentences = ehbridge.sentences("test");