इस तरह मैंने इसे समाप्त कर दिया। मैंने Q_INVOKABLE
विधि के साथ अपनी हेडर फ़ाइल में "जावास्क्रिप्ट ब्रिज" कक्षा घोषित की। Q_INVOKABLE
तरीकों जावास्क्रिप्ट से कहा जा सकता है:
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
संकेत को सुनने के। यह कदम, महत्वपूर्ण है क्योंकि वेबकिट जब एक नया पेज लोड हो रहा है सब को JavaScript ऑब्जेक्ट स्पष्ट करने के लिए जा रहा है, ताकि आप हर बार पुल वापस जोड़ने की जरूरत:
connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(mainFrame_javaScriptWindowObjectCleared()));
अंत में, javaScriptWindowObjectCleared
स्लॉट में, मैं जावास्क्रिप्ट पुल को जोड़ने :
void DictionaryWidget::mainFrame_javaScriptWindowObjectCleared() {
ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ehbridge", jsBridge_);
}
अब जावास्क्रिप्ट से, वैश्विक "एब्रिज" ऑब्जेक्ट उजागर होगा। मैं (क्यूटी जावास्क्रिप्ट प्रकार के क्यूटी के प्रकार धर्मान्तरित) एक सामान्य JavaScript वस्तु की तरह अपने तरीकों
var sentences = ehbridge.sentences("test");
स्रोत
2012-03-11 07:30:35
100% सही होने के लिए, Q_INVOKABLE सिर्फ एक स्लॉट बनाता है, इसलिए आप गतिशील रूप से किसी भी वर्ग के किसी भी सार्वजनिक स्लॉट आह्वान कर सकते हैं कॉल कर सकते हैं। फिर भी, यदि आप Q_INVOKABLE का उपयोग कर रहे हैं तो यह अधिक स्पष्ट रूप से स्पष्ट हो सकता है कि विधि "बाहर" से कॉल करने के लिए है। 'JavaScriptWindowObjectCleared' पर हर बार पुल को पुन: स्थापित करने के लिए –
+1 – cod3monk3y