2011-02-12 20 views
11

जावास्क्रिप्ट से एक स्लॉट में "पॉइंटर" फ़ंक्शन कैसे पास करें?क्यूटी QWEBview जावास्क्रिप्ट कॉलबैक

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

:

function f1() 
{ 
    alert("f1"); 
} 
qtclass.submit(f1); 

और क्यूटी में:

public slots: 
    void submit(void * ptr) 
    { 
     (void)ptr; 
    } 

मैं, "F1" की जरूरत C++, एक बार कुछ प्रसंस्करण किया जाता है से जावास्क्रिप्ट में निकाल दिया करने के लिए कार्य करते हैं। इसके अलावा मैं पहले से ही फंक्शन पॉइंटर का नाम नहीं जानता।

उत्तर

9

आपको QWebFrame::evaluateJavaScript विधि का उपयोग करके अपनी स्क्रिप्ट निष्पादित करने में सक्षम होना चाहिए। देखें कि नीचे एक उदाहरण आप के लिए काम करेंगे:

आरंभ वेबव्यू:

QWebView *view = new QWebView(this->centralWidget()); 
view->load(QUrl("file:///home//test.html")); 
connect(view, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); 

loadFinished संकेत हैंडलर:

void MyTestWindow::loadFinished(bool) 
{ 
    QVariant f1result = ((QWebView*)sender())->page()->mainFrame()->evaluateJavaScript("f1('test param')"); 
    qDebug() << f1result.toString(); 
} 

test.html:

<head> 
    <script LANGUAGE="JavaScript"> 
     function f1 (s) 
     { 
      alert (s) 
      return "f1 result" 
     } 
    </script> 
</head> 
<body> 
    test html 
</body> 

evaluateJavaScript चाहिए एक चेतावनी संदेश बॉक्स ट्रिगर करें और QVar वापस करें एफ 1 समारोह परिणाम के साथ विशाल।

आशा है कि यह मदद करता है, का संबंध

3

यह सभी मामलों में काम नहीं करेंगे, तो आप बस अपने स्लॉट के लिए एक स्ट्रिंग दे सकते हैं। फ़ंक्शन को कॉल करने के लिए आपका स्लॉट फिर मूल्यांकन जावास्क्रिप्ट (जैसा कि सर्ज ने सुझाव दिया है) का उपयोग कर सकते हैं।

function f1() 
{ 
    alert("f1"); 
} 
qtclass.submit("f1"); 

और क्यूटी में:

public slots: 
    void submit(QString functionName) 
    { 
     m_pWebView->page()->mainFrame()->evaluateJavaScript(functionName + "()"); 
    } 
6

इस प्रकार आप किसी अन्य तरीके से इस का समाधान कर सकता, क्यूटी संकेतों का उपयोग करके,:

class qtclass 
{ 
    signals: 
     void done(QString message); 
}; 

अपनी HTML फ़ाइल में आप इस से जुड़ सकते हैं सिग्नल, इस तरह:

qtclass.done.connect(f1); 

function f1(message) 
{ 
    alert('f1 called from qtclass with message' + message); 
} 

फिर आप C++ वर्ग को जावास्क्रिप्ट फ़ंक्शन के बारे में जानने की आवश्यकता नहीं है।

+0

मैं अपने जवाब का पालन करने की कोशिश कर रहा हूँ, और ही बात कर। हालांकि, यह मेरे लिए काम नहीं कर रहा है। मेरा प्रश्न यहां है - http://stackoverflow.com/questions/22037838/qt-qweb-callback-not-working-in-the-example-here। क्या आप कृपया उत्तर देने के लिए कुछ समय बचा सकते हैं? –

+1

सी ++ कोड में, क्या हमें पूरा करने की आवश्यकता है? –

+0

क्या आप इस प्रश्न का उत्तर देने पर ध्यान देंगे, http://stackoverflow.com/questions/22060192/why-callback-to-js-is-not-working-in-the-qtweb-using-signals-in-the-following- सह –

1

मेरे यहां स्लॉट का उपयोग करके एक संपूर्ण कार्य समाधान है। हालांकि, मुझे कर्ट द्वारा सुझाए गए संकेतों को काम नहीं मिल सका।

#include <QtGui/QApplication> 
#include <QApplication> 
#include <QDebug> 
#include <QWebFrame> 
#include <QWebPage> 
#include <QWebView> 

class MyJavaScriptOperations : public QObject { 
    Q_OBJECT 
public: 
    QWebView *view; 
    MyJavaScriptOperations(); 

    Q_INVOKABLE qint32 MultOfNumbers(int a, int b) { 
     qDebug() << a * b; 
     return (a*b); 
    } 
public slots: 
    void callback(); 
public: 

void firecb(); 

signals: 
     void done(); 
}; 


MyJavaScriptOperations::MyJavaScriptOperations() 
{ 
    view = new QWebView(); 
    view->resize(400, 500); 

    connect(view->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(callback())); 

    view->load(QUrl("./shreyas.html")); 

    view->show(); 


    qDebug()<<view; 


} 

void MyJavaScriptOperations::callback() 
{ 
    qDebug()<<"Sending hello text"; 
    QString function = "f1()"; 
    view->page()->mainFrame()->addToJavaScriptWindowObject("myoperations", this); 
    view->page()->mainFrame()->evaluateJavaScript("f1()"); 
    done(); 
} 

void MyJavaScriptOperations::firecb() 
{ 
    qDebug()<<"Emitting Signal"; 
    done(); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 


    MyJavaScriptOperations *jvs = new MyJavaScriptOperations; 
    jvs->firecb(); 

    return a.exec(); 
} 
#include "main.moc" 

html फ़ाइल परिवर्तन कर रहे हैं -

<head> 
    <script LANGUAGE="JavaScript"> 


function f1() 
{ 
    alert('f1 called from qtclass with message'); 
    document.write("HELLLLLLLLL"); 
} 
myoperations.callback(f1); 


function f2() 
{ 
    var result = myoperations.MultOfNumbers(3,7); 
    document.write(result); 
    alert('f1 called from qtclass with message'); 
} 


function f3() 
{ 

    alert('f3'); 
} 

myoperations.done.connect(f3); 


    </script> 
</head> 
<body> 
    test html 
<input type="button" value="click" onclick="f2()"> 
</body> 
संबंधित मुद्दे