2010-09-12 9 views
2

Veuillez noter que je suis un débutant complet pour le développement Qt.Comment déclencher un événement JavaScript via C++ dans QWebView

J'ai un QWebView avec un QObject ajouté à l'objet fenêtre JavaScript. Comment déclencher un événement JS sur cet objet?

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

Je souhaite être capable d'écouter des événements à l'aide de addEventListener.

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

Merci pour toute aide.

Répondre

3

Vous ne pouvez pas faire cela. Seuls les nœuds d'un arbre DOM peuvent déclencher des événements et l'objet que vous injectez n'est pas un nœud. Je suggère que vous envisagiez d'utiliser le mécanisme de slot de signal à la place. Vous pouvez connecter une fente JS à un signal que vous émettront dans votre code C++:

fente
window.objectName.signalName.connect(slot); 

est juste une fonction JS, que vous déclariez dans la partie JS de votre code:

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

Il prend autant d'arguments que ceux qui sont déclarés dans la signature du signal.

0

Dans un récent projet j'ai utilisé la technique suivante:

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); 
} 

Cette méthode semble toutes <object> balises et relie le signal playing à la fonction Javascript playingSlot(). La fonction playingSlot() crée à son tour un objet Event portant le nom play et le distribue en tant qu'événement DOM ordinaire. Le fichier HTML ressemble alors à:

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

Ceci est bien sûr travailler avec le plugin Qt Widgets. Je ne l'ai pas testé avec du HTML pur (c'est-à-dire où aucun plugin Qt n'est utilisé).