2012-03-08 18 views
12

मेरे पास एक QWebView में एक वेब पेज लोड किया गया है। वहां, मैं जावास्क्रिप्ट को अपने आवेदन का एक फ़ंक्शन कॉल करना चाहता हूं। वह फ़ंक्शन तब कुछ तारों को वापस करेगा जो जावास्क्रिप्ट गतिशील रूप से प्रदर्शित होंगे।क्या एक QWebView में जावास्क्रिप्ट से C++ फ़ंक्शन को कॉल करना संभव है?

क्या यह QWebView का उपयोग करके किया जा सकता है? असल में, क्या एप्लिकेशन (सी ++ में) और QWebView नियंत्रण के बीच कुछ पुल होना संभव है?

उत्तर

13

इस तरह मैंने इसे समाप्त कर दिया। मैंने 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"); 
+1

100% सही होने के लिए, Q_INVOKABLE सिर्फ एक स्लॉट बनाता है, इसलिए आप गतिशील रूप से किसी भी वर्ग के किसी भी सार्वजनिक स्लॉट आह्वान कर सकते हैं कॉल कर सकते हैं। फिर भी, यदि आप Q_INVOKABLE का उपयोग कर रहे हैं तो यह अधिक स्पष्ट रूप से स्पष्ट हो सकता है कि विधि "बाहर" से कॉल करने के लिए है। 'JavaScriptWindowObjectCleared' पर हर बार पुल को पुन: स्थापित करने के लिए –

+1

+1 – cod3monk3y