Frage

Sowohl QWebFrame und QWebPage haben void loadFinished(bool ok) Signal, das verwendet werden kann, zu erkennen, wenn eine Web-Seite vollständig geladen ist. Das Problem ist, wenn eine Web-Seite mit Inhalt asynchron (Ajax) geladen hat. Wie kann man wissen, wenn die Seite vollständig in diesem Fall geladen wird?

War es hilfreich?

Lösung

Ich habe nicht wirklich das getan, aber ich denke, Sie können der Lage sein, Ihre Lösung nach QNetworkAccessManager zu erreichen.

Sie können die QNetworkAccessManager von Ihrem QWebPage bekommen die networkAccessManager () mit Funktion . QNetworkAccessManager hat ein Signal (QNetworkReply * reply) das ausgelöst wird, wenn eine Datei ist auf Wunsch der QWebPage Instanz.

Das finished Signal gibt Ihnen eine QNetworkReply Instanz, von dem Sie eine Kopie der ursprünglichen Antrag gestellt bekommen, um die Anfrage zu identifizieren.

So einen Schlitz erstellen, um das finished Signal, verwenden Sie die übergebenen in QNetworkReply Methoden, welche Datei, um herauszufinden, zu befestigen hat das Herunterladen gerade fertig und wenn es Ihre Ajax-Anfrage ist, tun, was die Verarbeitung Sie tun müssen.

Meine einzige Einschränkung ist, dass ich nie zuvor getan habe, so bin ich nicht 100% sicher, dass es funktionieren würde.

Eine weitere Alternative könnte sein, QWebFrame Methoden zu verwenden, um Objekte in die Seite des Objektmodell einzufügen und auch einige JavaScript einzufügen, die dann das Objekt benachrichtigt, wenn die Ajax-Anfrage abgeschlossen ist. Dies ist eine etwas hackier Art und Weise tun, soll aber auf jeden Fall funktionieren.

EDIT:

Die zweite Option scheint mir besser. Der Arbeitsablauf ist wie folgt:

einen Schlitz zum QWebFrame :: javascriptWindowObjectCleared (Signal) anhängen. An dieser Stelle ruft QWebFrame :: evaluateJavascript () Code hinzufügen ähnlich den folgenden:     window.onload = function () {// Seite wird vollständig geladen}

setzen, was Code, den Sie in dieser Funktion benötigen. Sie könnten eine QObject auf die Seite über QWebFrame :: addToJavaScriptWindowObject () hinzufügen möchten, und dann auf das Objekt eine Funktion aufrufen. Dieser Code wird nur ausgeführt werden, wenn die Seite vollständig geladen ist.

Hoffentlich beantwortet sich die Frage!

Andere Tipps

Wenn Ihre erste html / images / etc fertig geladen, das ist es. Es ist vollständig geladen. Diese Tatsache ändert sich nicht, wenn Sie dann entscheiden, einige Javascript zu verwenden, um einige zusätzliche Daten, Seitenaufrufe oder was auch immer nach der Tat zu erhalten.

Wie gesagt, was ich vermute, Sie hier zu tun ist, ein Objekt / Schnittstelle zu Ihrer Ansicht QtScript belichten, die Sie von Ihrer Seite Skript aufrufen kann, effektiv ein „Rückruf“ in Ihr C ++ bietet, wenn Sie (aus der sich entschieden haben, Seite Skript), die Sie haben haben „vollständig geladen“.

Hope, das hilft Ihnen eine Richtung zu versuchen ...

, um die Last von bestimmtem Elemente Um zu überprüfen, können Sie eine QTimer verwenden. So etwas wie dies in 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"

Die OP dachte, es aufgrund verzögerter AJAX-Anforderungen war, aber es könnte auch ein weiterer Grund sein, die auch erklärt, warum ein sehr kurze Zeitverzögerung das Problem behebt. Es ist ein Fehler, die das beschriebene Verhalten führt:

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

Um dieses Problem zu umgehen die loadingFinished (Signal) angeschlossen werden muss Warteschlange Verbindung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top