2011-02-12 134 views
11

如何將JavaScript函數「指針」傳遞給插槽?Qt QWEBview JavaScript回調

在JavaScript:

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

和Qt的:

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

我需要的 「F1」,函數來獲得在JavaScript從C++中,一旦一些處理完成發射。另外我不知道函數指針的名字。

回答

9

您應該可以使用QWebFrame::evaluateJavaScript方法執行腳本。看看下面的例子會爲你工作:

初始化的WebView:

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與f1函數結果。

希望這會有所幫助,至於

3

雖然它不會在所有情況下,你可以簡單地傳遞了一個字符串的插槽。然後您的插槽可以使用evaluateJavaScript(如serge建議)調用該函數。

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

和Qt的:

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

你可以解決這個問題的另一種方式,通過使用Qt信號,如下:

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

在HTML文件中,可以連接到此信號如下:

qtclass.done.connect(f1); 

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

然後,你的C++類不需要知道JavaScript函數。

+0

我想跟着你的答案,並做同樣的事情。但是,它不適合我。這是我的問題 - http://stackoverflow.com/questions/22037838/qt-qweb-callback-not-working-in-the-example-here。你能抽出一些時間回答嗎? – 2014-02-26 12:33:59

1

我有一個完整的工作解決方案 - 使用插槽。然而,我不能按照Kurt所建議的那樣運行信號。

#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>