Qt QWEBview JavaScript回调

use*_*015 11 javascript qt qwebview slot

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

在JavaScript中:

function f1()
{
    alert("f1");
}
qtclass.submit(f1);
Run Code Online (Sandbox Code Playgroud)

在Qt:

public slots:
    void submit(void * ptr) 
    {
        (void)ptr;
    }
Run Code Online (Sandbox Code Playgroud)

我需要"f1"函数,一旦完成某些处理,就会从c ++中激活JavaScript.另外我事先并不知道函数指针的名称.

ser*_*nko 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)));
Run Code Online (Sandbox Code Playgroud)

loadFinished信号处理程序:

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

的test.html:

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

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

希望这有帮助,问候


Kur*_*tyn 6

您可以通过使用Qt信号以另一种方式解决此问题,如下所示:

class qtclass
{
   signals:
      void done(QString message);
};
Run Code Online (Sandbox Code Playgroud)

在您的HTML文件中,您可以连接到此信号,如下所示:

qtclass.done.connect(f1);

function f1(message)
{
   alert('f1 called from qtclass with message' + message);
}
Run Code Online (Sandbox Code Playgroud)

那你C++类不需要知道javascript函数.