Как запустить событие JavaScript через C ++ в QWebView - PullRequest
4 голосов
/ 12 сентября 2010

обратите внимание, что я полный новичок в разработке Qt.

У меня есть QWebView с QObject, добавленным в объект окна JavaScript. Как запустить событие JS для этого объекта?

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

Я хочу иметь возможность прослушивать события, используя addEventListener.

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

Спасибо за любую помощь.

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Вы не можете этого сделать. Только узлы в DOM-дереве могут инициировать события, а объект, который вы вводите, не является узлом. Я предлагаю вам рассмотреть возможность использования механизма сигнального слота вместо этого. Вы можете подключить слот в JS к сигналу, который вы будете излучать в своем коде C ++:

window.objectName.signalName.connect(slot);
Слот

- это просто функция JS, которую вы объявите в части кода JS:

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

Требуется столько аргументов, сколько заявлено в сигнатуре сигнала.

1 голос
/ 11 ноября 2011

В недавнем проекте я использовал следующую технику:

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).

...