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");
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 – cod3monk3y