Is it possible to call a C++ function from JavaScript in a QWebView?

前端 未结 1 1236
萌比男神i
萌比男神i 2021-02-07 20:01

I have a web page loaded in a QWebView. In there, I would like to have JavaScript call a function of my application. That function would then returns some strings that JavaScrip

相关标签:
1条回答
  • 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");
    
    0 讨论(0)
提交回复
热议问题