4

请注意,我是 Qt 开发的初学者。

我有一个 QWebView,其中添加了一个 QObject 到 JavaScript 窗口对象。如何在该对象上触发 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 回答