2015-08-10 7 views
8

मैं वेब पेज प्रदर्शित करने के लिए क्यूटी वेबइंजिन फ्रेमवर्क का उपयोग कर रहा हूं। जब मैं लोड करता हूं तो मैं जावास्क्रिप्ट को किसी पृष्ठ में इंजेक्शन दे रहा हूं, और जावास्क्रिप्ट को क्यूटी ऑब्जेक्ट तक पहुंचने में सक्षम होना चाहता हूं। जाहिर है, ऐसा करने के लिए एक QWebChannel मौजूद होना चाहिए जो क्रोमियम (जावास्क्रिप्ट) और मेरे बाकी सी ++/क्यूटी परियोजना के बीच कुछ आईपीसी स्थापित करता है। मैं QWebEnginePage :: setWebChannel (QWebChannel * चैनल) फ़ंक्शन में आया, हालांकि मुझे इसके उपयोग के कोई उदाहरण नहीं मिल रहे हैं। प्रलेखन (http://doc.qt.io/qt-5/qwebenginepage.html#setWebChannel) का उल्लेख है कि qt.webChannelTransport जावास्क्रिप्ट संदर्भ में उपलब्ध होना चाहिए, लेकिन मुझे नहीं पता कि qwebchannel.js (https://github.com/qtproject/qtwebchannel/blob/dev/src/webchannel/qwebchannel.js) में यह कहां स्थापित है। मैंने WebChannel उदाहरणों को देखा है (http://doc.qt.io/qt-5/qtwebchannel-examples.html) और यदि संभव हो तो वेबसाकेट से बचना चाहेंगे।क्यूटी QWebEnginePage :: setWebChannel() परिवहन ऑब्जेक्ट

नीचे मैंने वेब चैनल को कार्यान्वित करने का प्रयास किया है।

जब भी कोई पृष्ठ लोड मैं एक चैनल स्थापित करने और C++ जावास्क्रिप्ट इंजेक्षन:

QWebChannel *channel = new QWebChannel(); 
channel->registerObject(QStringLiteral("jshelper"), helper); 

view->page()->runJavaScript(qwebjs); //this is qwebchannel.js 
view->page()->setWebChannel(channel); 
view->page()->runJavaScript(myfunction); //function that calls QT object (jshelper) 

जावास्क्रिप्ट में:

new QWebChannel(qt.webChannelTransport, function(channel) { ... }); 

कौन सा नहीं ठीक से जोड़ा जा रहा चैनल में परिणाम (यह मानते हुए कि यह qt.webChannelTransport की वजह से है, क्योंकि जब मैं WebSockets का उपयोग कर रहा था तब यह काम कर रहा था)। QWebChannel के उदाहरणों के लिए कोई संकेतक QWebEnginePage के साथ स्थापित किए जा रहे हैं इस तरह भी सराहना की जाती है।

उत्तर

20

लघु जवाब: अपने सी ++ कोड से अपने html पृष्ठ के लिए <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script> जोड़ने (इससे पहले कि आप निश्चित रूप से new QWebChannel कहते हैं), और हटाने लाइन view->page()->runJavaScript(qwebjs); //this is qwebchannel.js

लांग जवाब:

मैं भी पता लगाना सही ढंग से WebSockets बिना QWebChannel उपयोग करने के लिए कैसे मुसीबत से एक टन था - प्रलेखन है प्रबंधित यह क्यूटी 5.5 स्रोत कोड और मेलिंग सूची में चारों ओर खुदाई के बाद काम करने के लिए (अभी भी कमी है)। ध्यान दें कि यह केवल the new Qt 5.5 के साथ काम करता है।

यहाँ QWebChannel का उपयोग कैसे करें:

// file: MyWebEngineView.cpp, MyWebEngineView extends QWebEngineView 
QWebChannel *channel = new QWebChannel(page()); 

// set the web channel to be used by the page 
// see http://doc.qt.io/qt-5/qwebenginepage.html#setWebChannel 
page()->setWebChannel(channel); 

// register QObjects to be exposed to JavaScript 
channel->registerObject(QStringLiteral("jshelper"), helper); 

// now you can call page()->runJavaScript(...) etc 
// you DON'T need to call runJavaScript with qwebchannel.js, see the html file below 

// load your page 
load(url); 

और जे एस तरफ:

<!-- NOTE: this is what you're missing --> 
<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script> 

<script type="text/javascript"> 
    <!-- it's a good idea to initialize webchannel after DOM ready, if your code is going to manipulate the DOM --> 
    document.addEventListener("DOMContentLoaded", function() { 
     new QWebChannel(qt.webChannelTransport, function (channel) { 
      var jshelper = channel.objects.jshelper; 
      // do what you gotta do 
     }); 
    }); 
</script> 

यह भी सुनिश्चित करें कि आप अपने .pro फाइल करने के लिए QT += webenginewidgets webchannel जोड़ दिया है और ने इस का निर्माण नहीं होगा!

बोनस: अब आप क्रोम देव उपकरण के आराम से अपनी जावास्क्रिप्ट को डीबग कर सकते हैं!बस अपने क्यूटी कोड में यह कहीं न कहीं जोड़ने (आदर्श आपके आवेदन स्टार्टअप में):

#ifdef QT_DEBUG 
    qputenv("QTWEBENGINE_REMOTE_DEBUGGING", "23654"); 
#endif 

फिर, अपने आवेदन शुरू क्रोम में http://localhost:23654 पर नेविगेट करें और आप ठीक प्रकार से कार्य जे एस डिबगर, प्रोफाइलर, सांत्वना मिल जाएगा, आदि :)


का पालन-अप (19/04/2016): अगर आपके दूरस्थ डीबगर काम नहीं कर रहा, ध्यान दें कि qputenv कॉल भी QWebEngineSettings या किसी अन्य के लिए से पहले किसी भी कॉल होने चाहिए वेबइंजिन से संबंधित वर्ग, क्योंकि थीस ई वेबइंजिन "ज़ीगोट" प्रक्रिया को तत्काल ट्रिगर करें (ज़ीगोट अभिभावक क्यूटीवेबइंजिन प्रोसेस है जिसमें से सभी भविष्य QtWebEngineProcesses फोर्क किए जाते हैं) और फिर qputenv इसे प्रभावित नहीं कर सकता है। इसे ट्रैक करने में कुछ घंटे बिताएं।

+0

यह बहुत अच्छा है - मेरी एकमात्र समस्या यह है कि मुझे स्क्रिप्ट को इंजेक्ट करना होगा क्योंकि मेरे पास लोड होने वाले पृष्ठों पर कोई नियंत्रण नहीं है। साथ ही, जब आप "नया क्यूटी 5.5" कहते हैं, तो क्या आप देव शाखा से हैं? मैं क्यूटी निर्माता 5.5.0 का उपयोग कर रहा हूं और मुझे यकीन नहीं है कि क्यूटी स्रोत कोड को कैसे अपडेट किया गया है जो मैं काम कर रहा हूं। मैंने कंसोल में जेएस डीबग करने के लिए पर्यावरण परिवर्तनीय सेटिंग की कोशिश की लेकिन यह काम नहीं कर रहा है (मुझे लगता है क्योंकि यह डीबग विकल्प हालिया प्रतिबद्धता से है)। – mathieujofis

+0

मैं देखता हूं। क्यूटी निर्माता में, टूल्स> विकल्प> बिल्ड और रन> क्यूटी संस्करणों पर जाएं और जांचें कि आपके पास कौन सा संस्करण है। जब मैं क्यूटी 5.5 कहता हूं, मेरा मतलब है [स्थिर संस्करण जो इस साल 1 जुलाई को जारी किया गया था] (http://blog.qt.io/blog/2015/07/01/qt-5-5-released/) । क्यूटी 5.5 ने QWebChannel पर क्रोमियम आईपीसी के लिए अंतर्निहित समर्थन जोड़ा (यानी, 'QWebEnginePage :: setWebChannel() 'और' qt.webChannelTransport' जेएस में)। साथ ही, आपका क्यूटी निर्माता v5.5 पर नहीं हो सकता है, [नवीनतम संस्करण v3.4.2 है) (http://blog.qt.io/blog/2015/07/01/qt-creator-3-4-2- जारी /) :) –

+0

इसके अलावा, QTWEBENGINE_REMOTE_DEBUGGING' Qt 5.5 रिलीज़ में मौजूद है: http://stackoverflow.com/a/29721197/504611 –

संबंधित मुद्दे