11

関数「ポインター」を JavaScript からスロットに渡す方法は?

JavaScript で:

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

そしてQtで:

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

何らかの処理が完了したら、C++ から JavaScript で起動される関数「f1」が必要です。また、関数ポインタの名前も事前にわかりません。

4

4 に答える 4

9

QWebFrame::evaluateJavaScriptメソッドを使用してスクリプトを実行できるはずです。以下の例があなたのために働くかどうか見てください:

Webビューの初期化:

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>

EvaluationJavaScriptは、アラートメッセージボックスをトリガーし、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 に答える