4

私は Qt 開発の完全な初心者です。

JavaScript ウィンドウ オブジェクトに QObject が追加された QWebView があります。そのオブジェクトで JS イベントを発生させるにはどうすればよいですか?

view->page()->mainFrame()->addToJavaScriptWindowObject(objName,obj);

addEventListener を使用してイベントをリッスンできるようにしたいと考えています。

window.objName.addEventListener('customEventName',function(e){ ... });

助けてくれてありがとう。

4

2 に答える 2

4

それをしてはいけない。DOM ツリー内のノードのみがイベントを発生させることができ、注入するオブジェクトはノードではありません。代わりにシグナルスロットメカニズムの使用を検討することをお勧めします。JS のスロットを、C++ コードで発行するシグナルに接続できます。

window.objectName.signalName.connect(slot);

slot は単なる JS 関数であり、コードの JS 部分で宣言します。

function slot(arg1, arg2, ...)
{
}

シグナルの署名で宣言されているのと同じ数の引数を取ります。

于 2010-09-13T20:52:02.747 に答える
1

最近のプロジェクトでは、次の手法を使用しました。

void VideoWebPage::urlLoaded(bool ok)
{
    static const QString javascript =
        "function installCallbacks()                                    " \
        "{                                                                  " \
        "   var videoTags = document.getElementsByTagName('object');        " \
        "   for (var i = 0; i < videoTags.length; ++i)                      " \
        "   {                                                               " \
        "        if (videoTags[i].type == 'application/x-qt-plugin')        " \
        "        {                                                          " \
        "            if (videoTags[i].playing)                              " \
        "            {                                                      " \
        "                videoTags[i].playing.connect(playingSlot); " \
        "            }                                                      " \
        "        }                                                          " \
        "    }                                                              " \
        "}                                                                  " \
        \
        "function playingSlot(videoId)                              " \
        "{                                                                  " \
        "    var playEvent=document.createEvent('Events');                  " \
        "    playEvent.initEvent('play', true, false);                      " \
        "    document.getElementById(videoId).dispatchEvent(playEvent); " \
        "}                                                                  " \
        "installCallbacks();                                            ";
    mainFrame()->evaluateJavaScript(javascript);
}

このメソッドは、すべての<object>タグを検索し、playingシグナルを Javascript 関数に接続しますplayingSlot()。このplayingSlot()関数は、そのEvent名前でオブジェクトを作成playし、通常の DOM イベントとしてディスパッチします。HTML ファイルは次のようになります。

<html>
<head>
<script language="text/javascript">
    void init()
    {
        document.getElementById('id1').addEventListener('play', onPlay);
    }
    void onPlay(event)
    {
        alert('playing');
    }
</script>
</head>
<body onload='init()'>
    <object id='id1' type='application/x-qt-plugin'>
    </object>
</body>
</html>

もちろん、これは Qt プラグイン ウィジェットで動作します。プレーンな HTML (つまり、Qt プラグインが使用されていない場所) ではテストしませんでした。

于 2011-11-11T13:44:18.360 に答える