Domanda

Sia QWebFrame e QWebPage hanno void loadFinished(bool ok) segnale che può essere utilizzato per rilevare quando una pagina web è completamente caricato. Il problema è quando una pagina web ha alcuni contenuti caricati in modo asincrono (Ajax). Come sapere quando la pagina viene caricata completamente in questo caso?

È stato utile?

Soluzione

Non ho effettivamente fatto questo, ma penso che possono in grado di raggiungere la soluzione utilizzando QNetworkAccessManager.

È possibile ottenere il QNetworkAccessManager dal QWebPage utilizzando il networkAccessManager () funzione . QNetworkAccessManager ha un segnale finito (QNetworkReply * risposta) che viene sparato ogni volta che un file è richiesto dall'istanza QWebPage.

Il segnale finished ti dà un esempio QNetworkReply, da cui è possibile ottenere una copia della richiesta originale fatta, al fine di individuare la richiesta.

Quindi, creare uno slot per collegare al segnale finished, utilizzare il passato-in metodi di QNetworkReply per capire quale file ha appena terminato il download e se è la vostra richiesta Ajax, fare tutto ciò che l'elaborazione è necessario fare.

La mia unica avvertenza è che non ho mai fatto prima, quindi non sono sicuro al 100% che avrebbe funzionato.

Un'altra alternativa potrebbe essere quella di utilizzare metodi di QWebFrame di inserire oggetti in modello a oggetti della pagina e inserire anche qualche JavaScript che poi invia al vostro oggetto quando la richiesta Ajax è completa. Questo è un modo un po 'hackier di farlo, ma deve assolutamente funzionare.

EDIT:

La seconda opzione sembra meglio per me. Il flusso di lavoro è la seguente:

Attaccare una fessura al segnale QWebFrame :: javascriptWindowObjectCleared (). A questo punto, richiamare QWebFrame :: evaluateJavascript () per aggiungere il codice simile al seguente:     window.onload = function () {// pagina ha pieno carico}

mettere qualsiasi codice necessario a tale funzione. Si potrebbe desiderare di aggiungere un QObject alla pagina tramite QWebFrame :: addToJavaScriptWindowObject () e quindi chiamare una funzione su tale oggetto. Questo codice verrà eseguito solo quando la pagina è caricata completamente.

Speriamo che questo risponde alla domanda!

Altri suggerimenti

Quando i vostri iniziali html / images / etc termine del caricamento, il gioco è fatto. E ' è completamente caricato. Questo fatto non cambia se si decide poi di usare un po 'di javascript per ottenere alcuni dati aggiuntivi, visualizzazioni di pagina o qualunque sia dopo il fatto.

Detto questo, ciò che ho il sospetto che si vuole fare qui è esporre un QtScript oggetto / interfaccia per la visualizzazione che è possibile richiamare dalla sceneggiatura di pagina, in modo efficace offrendo un "callback" in vostro C ++, una volta che hai deciso (dal pagina di script) che hai hai "completamente caricato".

Spero che questo aiuta a dare una direzione per cercare di ...

Per controllare il carico di elemento specifico è possibile utilizzare un QTimer. Qualcosa di simile 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"

Il PO pensato che fosse a causa di richieste AJAX in ritardo, ma ci potrebbe anche essere un altro motivo che spiega anche il motivo per cui un molto ritardo di poco tempo risolve il problema. C'è un bug che causa il comportamento descritto:

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

Per risolvere questo problema il segnale loadingFinished () deve essere collegato mediante collegamento in coda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top