最近のプロジェクトでは、次の手法を使用しました。
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 プラグインが使用されていない場所) ではテストしませんでした。