代码之家  ›  专栏  ›  技术社区  ›  J. K.

如何在QWebView中通过C++触发JavaScript事件

  •  3
  • J. K.  · 技术社区  · 14 年前

    请注意,我完全是qt开发的初学者。

    我有一个QWebView,其中有一个QObject添加到javascript窗口对象中。 如何在该对象上触发JS事件?

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

    我希望能够使用AddEventListener来侦听事件。

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

    谢谢你的帮助。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Jakub Wieczorek    14 年前

    你不能那样做。只有DOM树中的节点才能触发事件,而您要注入的对象不是节点。我建议您考虑改用信号槽机制。您可以将JS中的插槽连接到您将在C++代码中发射的信号:

    window.objectName.signalName.connect(slot);
    

    slot只是一个JS函数,您将在代码的JS部分声明它:

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

    它接受信号签名中声明的参数。

        2
  •  1
  •   Kurt Pattyn    13 年前

    在最近的一个项目中,我使用了以下技术:

    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() . 这个 播放菜单() 函数反过来创建一个 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插件的地方)。