11

如何将函数“指针”从 JavaScript 传递到插槽?

在 JavaScript 中:

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

在 Qt 中:

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

一旦完成一些处理,我需要“f1”函数从 c++ 在 JavaScript 中触发。另外我事先不知道函数指针的名称。

4

4 回答 4

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();
}

测试.html:

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

evaluateJavaScript应该触发一个警告消息框并返回带有 f1 函数结果的 QVariant。

希望这会有所帮助,问候

于 2011-02-12T17:58:03.810 回答
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 函数。

于 2011-11-11T13:53:42.723 回答
3

虽然它不适用于所有情况,但您可以简单地将字符串传递给您的插槽。然后,您的插槽可以使用 evaluateJavaScript(如 serge 所建议的那样)来调用该函数。

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

在 Qt 中:

public slots:
    void submit(QString functionName) 
    {
        m_pWebView->page()->mainFrame()->evaluateJavaScript(functionName + "()");
    }
于 2011-02-12T18:32:12.080 回答
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>
于 2014-02-26T16:34:44.513 回答