Question

Les deux QWebFrame et QWebPage ont le signal void loadFinished(bool ok) qui peut être utilisé pour détecter lorsqu'une page Web est complètement chargée. Le problème est quand une page web a un contenu chargé de manière asynchrone (ajax). Comment savoir quand la page est complètement chargée dans ce cas?

Était-ce utile?

La solution

Je ne l'ai pas vraiment fait cela, mais je pense que vous peut être en mesure d'atteindre votre solution en utilisant QNetworkAccessManager.

Vous pouvez obtenir le QNetworkAccessManager de votre QWebPage en utilisant networkAccessManager () fonction . QNetworkAccessManager a un signal fini (* QNetworkReply réponse) qui est tiré chaque fois qu'un fichier est demandé par l'instance QWebPage.

Le signal finished vous donne un exemple QNetworkReply, à partir de laquelle vous pouvez obtenir une copie de la demande initiale faite, afin d'identifier la demande.

Alors, créez une fente pour attacher au signal de finished, utilisez les méthodes de QNetworkReply refacturés pour savoir quel fichier vient de terminer le téléchargement et si elle est votre demande Ajax, faire tout ce que le traitement que vous devez faire.

Ma seule réserve est que je ne l'ai jamais fait ça avant, donc je ne suis pas 100% sûr que cela fonctionnerait.

Une autre alternative pourrait consister à utiliser les méthodes de QWebFrame d'insérer des objets dans le modèle d'objet de la page et insérer également un peu de JavaScript qui notifie alors votre objet lorsque la demande Ajax est complète. Ceci est une façon légèrement hackier de le faire, mais devrait certainement travailler.

EDIT:

La deuxième option me semble mieux. Le flux de travail est le suivant:

Attacher une fente au signal QWebFrame :: javascriptWindowObjectCleared (). À ce stade, appelez QWebFrame :: evaluateJavascript () pour ajouter un code similaire à ce qui suit:     window.onload = function () {// page a complètement chargé}

Mettez ce code que vous devez dans cette fonction. Vous pouvez ajouter un QObject à la page via QWebFrame :: addToJavaScriptWindowObject (), puis appeler une fonction sur cet objet. Ce code n'exécutera lorsque la page est complètement chargée.

Espérons que cela répond à la question!

Autres conseils

Lorsque votre code html initial / images / etc fin du chargement, c'est tout. Il est complètement chargé. Ce fait ne change pas si vous décidez d'utiliser javascript pour obtenir des données supplémentaires, pages vues ou autre après le fait.

Cela dit, ce que je suppose que vous voulez faire ici est d'exposer un objet QtScript / interface à votre avis que vous pouvez appeler à partir du script de votre page, qui fournit effectivement un « rappel » dans votre C ++ une fois que vous avez décidé (à partir de la script de la page) que vous avez avez "complètement chargé".

Espérons que cela vous aide à donner une direction à essayer ...

Pour vérifier la charge de l'élément spécifique, vous pouvez utiliser un QTimer. Quelque chose comme cela en python:

@pyqtSlot()
def on_webView_loadFinished(self): 
    self.tObject = QTimer()
    self.tObject.setInterval(1000)
    self.tObject.setSingleShot(True)
    self.tObject.timeout.connect(self.on_tObject_timeout)
    self.tObject.start()

@pyqtSlot()
def on_tObject_timeout(self):
    dElement = self.webView.page().currentFrame().documentElement()
    element  = dElement.findFirst("css selector")
    if element.isNull():
        self.tObject.start()

    else:
        print "Page loaded"

L'OP pensait que cela était dû à des requêtes AJAX en retard, mais il pourrait aussi être une autre raison qui explique aussi pourquoi très court délai résout le problème. Il y a un bug qui provoque le comportement décrit:

https://bugreports.qt-project.org/browse/QTBUG-37377

Pour contourner ce problème le signal chargementTermine () doit être connecté via une connexion en attente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top