2012-03-08 16 views
12

Bir QWebView'a yüklenmiş bir web sayfam var. Orada, JavaScript uygulamasının bir işlevini çağırmasını istiyorum. Bu işlev, JavaScript'in dinamik olarak görüntüleyeceği bazı dizeleri döndürür.QWebView'da JavaScript'ten bir C++ işlevi çağırmak mümkün mü?

QWebView kullanılarak yapılabilir mi? Temel olarak, uygulama (C++) ve QWebView denetimi arasında bir köprü olması mümkün mü?

cevap

13

Bunu nasıl yaptığım bitti. Başlık dosyasımda Q_INVOKABLE yöntemiyle bir "JavaScriptBridge" sınıfı bildirdim. Q_INVOKABLE yöntemler JavaScript çağrılabilir:

class DictionaryJavaScriptBridge : public QObject { 

    Q_OBJECT 

public: 

    DictionaryJavaScriptBridge(DictionaryWidget* dictionaryWidget); 
    Q_INVOKABLE QStringList sentences(QString characters); 

private: 

    DictionaryWidget* dictionaryWidget_; 

}; 

Sonra benim .cpp dosyasında, ben köprü oluşturmak:

jsBridge_ = new DictionaryJavaScriptBridge(this); 

Ve javaScriptWindowObjectCleared sinyali dinlemek.

connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(mainFrame_javaScriptWindowObjectCleared())); 

Son olarak javaScriptWindowObjectCleared yuvasına, JavaScript köprü ekleyin: her zaman köprüyü geri eklemeniz gerekir böylece bu adım WebKit yeni bir sayfa yüklenirken tüm JavaScript nesneleri temizlemek için gidiyor çünkü önemlidir :

void DictionaryWidget::mainFrame_javaScriptWindowObjectCleared() { 
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ehbridge", jsBridge_); 
} 

Artık JavaScript'ten, çevrilmiş küresel bir "ehbridge" nesnesi olacaktır. Ben normal bir JavaScript nesne gibi yöntemlerini (Qt JavaScript türlerine QT'ın türlerini dönüştürür)

var sentences = ehbridge.sentences("test"); 
+1

dinamik herhangi sınıfın hiçbir yuvası çağırmak böylece Q_INVOKABLE sadece bir yuva oluşturur,% 100 doğru olması için çağırabilir. Yine de, Q_INVOKABLE yöntemini, yöntemin "dışarıdan" çağırmak için kullanılması durumunda kullanmanız, daha net olabilir. JavaScriptWindowObjectCleared''de her seferinde köprüyü yeniden oluşturmak için –

+1

+1 – cod3monk3y

İlgili konular